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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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