Буферизация кадров камеры

Добавлено в ARCore 1.17.0.

Большинству приложений для рендеринга достаточно буферизовать только один кадр камеры. Однако ARCore также поддерживает буферизацию нескольких кадров камеры в циклической очереди текстур фиксированного размера.

Приложения с многопоточным конвейером рендеринга могут использовать буферизацию, чтобы повысить производительность рендеринга. Буферизация также может помочь приложениям отображать кадры с более постоянной частотой кадров, что может уменьшить визуальное заикание, вызванное медленным рендерингом пользовательского интерфейса .

Предварительные условия

Буферизация изображения камеры включается при любом из следующих условий:

  1. При включении приложением путем вызова ArSession_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 потребляет примерно 6 МБ памяти (полученная путем умножения разрешения 1920 x 1080 на три байта данных RGB на пиксель).

Вопросы производительности

Использование нескольких кадров камеры не гарантирует снижения изменчивости частоты кадров, а использование многопоточного конвейера рендеринга не гарантирует повышение производительности при любых обстоятельствах. Следующие факторы влияют на реальную производительность:

  • Конвейер рендеринга приложения

  • Модель потоков приложения

  • Архитектура процессора устройства

  • Система планирования операционной системы

Если ваше приложение не может использовать преимущества дополнительных кадров камеры, использование более одной текстуры не даст никакого преимущества в производительности.

Включить буферизацию

Чтобы указать ARCore, какие текстуры использовать для буферизации входящих кадров камеры, используйте ArSession_setCameraTextureNames(ids) , чтобы предоставить массив из одного или нескольких идентификаторов текстур. Эта функция вызывается только после создания сеанса и обычно вызывается только один раз.

Во время каждого вызова ArSession_update() ARCore перезаписывает следующую текстуру в очереди в циклической последовательности. Если ваше приложение устанавливает только один идентификатор текстуры, одна и та же текстура будет перезаписываться каждый раз.

Используйте ArFrame_getCameraTextureName() чтобы определить идентификатор текстуры, связанный с текущим кадром.