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

Se agregó a ARCore 1.17.0

La mayoría de las apps solo necesitan almacenar en el búfer un único marco 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 una cola de texturas round-robin de tamaño fijo.

Las apps con una canalización de renderización de varios subprocesos pueden usar el almacenamiento en búfer para ayudar a mejorar el rendimiento de la renderización. El almacenamiento en búfer también puede ayudar a las apps a renderizar fotogramas a una velocidad de fotogramas más coherente, lo que puede reducir las saltos visuales causadas por la 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 están habilitadas una o más funciones de ARCore que requieren almacenamiento en búfer interno. Actualmente, esto incluye las siguientes funciones:

    • Imágenes aumentadas
    • Caras aumentadas
  3. En algunos dispositivos compatibles con ARCore que requieren almacenamiento en búfer interno para funcionar correctamente

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

Para determinar si un dispositivo y una sesión de RA determinados tienen habilitado el 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 marco de cámara adicional almacenado en búfer aumenta la utilización de memoria. Por ejemplo, una textura de 1080p consume aproximadamente 6 MB de memoria (que se obtiene al multiplicar una resolución de 1,920 x 1,080 por tres bytes de datos RGB por píxel).

Consideraciones de rendimiento

No se garantiza que el uso de varios fotogramas de cámara disminuya la variabilidad de las velocidades de fotogramas, y no se garantiza que el uso de una canalización de procesamiento multiproceso proporcione un mejor rendimiento en todas las circunstancias. Los siguientes factores afectan el rendimiento en el mundo real:

  • Canalización de procesamiento de apps

  • El modelo de subprocesos de la app

  • Arquitectura de la CPU del dispositivo

  • El sistema de programación del sistema operativo

Si tu app no puede aprovechar los marcos adicionales de la cámara, no hay ninguna ventaja de rendimiento si usas más de una textura.

Cómo habilitar el almacenamiento en búfer

Si quieres 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 textura. Esta función se llama solo después de la creación de la sesión y, por lo general, se llama solo una vez.

Durante cada llamada a Session.update(), ARCore reemplaza la siguiente textura de la cola en una secuencia de 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.