카메라 프레임 버퍼링

ARCore 1.17.0에 추가됨

대부분의 앱은 렌더링을 위한 단일 카메라 프레임만 버퍼링하면 됩니다. 그러나 ARCore는 고정 크기 라운드 로빈 텍스처 큐에서 여러 카메라 프레임의 버퍼링도 지원합니다.

멀티스레드 렌더링 파이프라인을 사용하는 앱은 버퍼링을 사용하여 렌더링 성능을 개선할 수 있습니다. 또한 버퍼링은 앱이 더 일관된 프레임 속도로 프레임을 렌더링하는 데 도움이 될 수 있으며, 이를 통해 느린 UI 렌더링으로 인한 시각적 끊김 현상을 줄일 수 있습니다.

전제조건

카메라 이미지 버퍼링은 다음 조건 중 하나라도 사용할 수 있습니다.

  1. 여러 텍스처 ID로 Session.setCameraTextureNames(ids)를 호출하여 앱에서 사용 설정한 경우

  2. 내부 버퍼링이 필요한 하나 이상의 ARCore 기능이 사용 설정된 경우: 현재 다음과 같은 기능이 제공됩니다.

    • 증강 이미지
    • 얼굴 증강 현실
  3. 올바르게 작동하려면 내부 버퍼링이 필요한 특정 ARCore 지원 기기

프레임 지연 사용 설정 여부 확인

특정 기기와 AR 세션에 프레임 버퍼링 (프레임 지연이라고도 함)이 사용 설정되어 있는지 확인하려면 adb logcat 출력을 사용하세요.

# Camera frame buffering is turned off when frame delay is zero.
adb logcat | grep 'Update Frame Delay'
… I native  : session.cc:3141 Update Frame Delay to 0 frames.
# Camera frame buffering is turned on when frame count is non-zero.
# Note: The size of the buffer can vary over time.
adb logcat | grep 'Update Frame Delay'
… I native  : session.cc:3141 Update Frame Delay to 6 frames.

… I native  : session.cc:3141 Update Frame Delay to 4 frames.

… I native  : session.cc:3141 Update Frame Delay to 2 frames.

메모리

카메라 프레임이 추가로 버퍼링될 때마다 메모리 사용률이 높아집니다. 예를 들어 1080p 텍스처는 약 6MB의 메모리를 사용합니다 (해상도 1920 x 1080에 픽셀당 3바이트 RGB 데이터를 곱하여 얻음).

성능에 대한 고려사항

여러 카메라 프레임을 사용한다고 해서 프레임 속도의 가변성이 감소하는 것은 아니며, 멀티스레드 렌더링 파이프라인을 사용한다고 해서 모든 상황에서 더 나은 성능이 보장되는 것은 아닙니다. 실제 성능에 영향을 주는 요인은 다음과 같습니다.

  • 앱 렌더링 파이프라인

  • 앱 스레딩 모델

  • 기기 CPU 아키텍처

  • 운영체제 예약 시스템

앱이 추가 카메라 프레임을 활용할 수 없는 경우 둘 이상의 텍스처를 사용해도 성능상의 이점은 없습니다.

버퍼링 사용 설정

수신 카메라 프레임을 버퍼링하는 데 사용할 텍스처를 ARCore에 지시하려면 Session.setCameraTextureNames(ids)를 사용하여 하나 이상의 텍스처 ID 배열을 제공합니다. 이 함수는 세션이 생성된 후에만 호출되며 일반적으로 한 번만 호출됩니다.

Session.update()를 호출할 때마다 ARCore는 라운드 로빈 시퀀스에서 큐의 다음 텍스처를 덮어씁니다. 앱에서 텍스처 ID를 하나만 설정하면 매번 동일한 텍스처를 덮어쓰게 됩니다.

Frame.getCameraTextureName()를 사용하여 현재 프레임과 연결된 텍스처 ID를 확인합니다.