Cómo almacenar en búfer los fotogramas de cámara

Se agregó en ARCore 1.17.0

La mayoría de las apps solo necesitan almacenar en búfer un único fotograma de cámara para la renderización. Sin embargo, ARCore también admite el almacenamiento en búfer de varios fotogramas de cámara en un tamaño fijo fila de texturas round robin.

Las apps con una canalización de renderización multiproceso pueden usar el almacenamiento en búfer para mejorar y el rendimiento de la renderización. El almacenamiento en búfer también puede ayudar a las apps a renderizar los fotogramas con una mayor velocidad de fotogramas constante, lo que puede reducir la inestabilidad visual causada por Renderización lenta de la IU.

Condiciones previas

El almacenamiento en búfer de imágenes de la cámara se habilita en cualquiera de las siguientes condiciones:

  1. Cuando la app lo habilita mediante una llamada a Session.setCameraTextureNames(ids) con varios IDs de texturas.

  2. Cuando una o más funciones de ARCore que requieren almacenamiento en búfer interno habilitada. Actualmente, esto incluye las siguientes funciones:

    • Imágenes aumentadas
    • Rostros aumentados
  3. En ciertos dispositivos compatibles con ARCore que requieren almacenamiento en búfer interno para lo siguiente: funcionen correctamente.

Cómo determinar si el retraso de fotogramas está habilitado

Para determinar si un dispositivo determinado y una sesión de RA tienen almacenamiento en búfer de fotogramas (también conocido como retraso de fotogramas), usa el resultado de logcat adb:

# 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.

Memoria

Cada fotograma adicional almacenado en el búfer de la cámara aumenta el uso de la memoria. Por ejemplo: una textura de 1080p consume aproximadamente 6 MB de memoria (que se obtiene multiplicando una resolución de 1920 x 1080 por tres bytes de datos RGB por píxel).

Consideraciones de rendimiento

No se garantiza que el uso de múltiples fotogramas de cámara disminuya la variabilidad de velocidad de fotogramas, y el uso de una canalización de renderización multiproceso no garantiza mejorar el rendimiento en todas las circunstancias. Los siguientes factores afectan Rendimiento en el mundo real:

  • La canalización de procesamiento de la app

  • El modelo de subprocesos de la app

  • La arquitectura de la CPU del dispositivo

  • El sistema de programación del sistema operativo

Si tu app no puede aprovechar los marcos de cámara adicionales, no habrá al usar más de una textura.

Habilitar el almacenamiento en búfer

Para indicarle a ARCore qué texturas debe usar para almacenar en búfer los fotogramas de cámara entrantes, usa Session.setCameraTextureNames(ids) para proporcionar un array de uno o más IDs de texturas. Esta función se llama solo después de que se crea la sesión y, por lo general, solo se la llama una vez.

Durante cada llamada a Session.update(), ARCore reemplaza la siguiente textura en la cola en una secuencia round robin. Si tu app establece un solo ID de textura, se reemplazará la misma textura cada vez.

Usa Frame.getCameraTextureName() para determinar el ID de textura asociado. con el marco actual.