Frames de câmera armazenados em buffer

Adicionado no ARCore 1.17.0

A maioria dos apps só precisa armazenar em buffer um único frame da câmera para renderização. No entanto, O ARCore também oferece suporte ao armazenamento em buffer de vários frames da câmera em um formato de textura round-robin.

Os apps com um pipeline de renderização com várias linhas de execução podem usar o armazenamento em buffer para melhorar o desempenho de renderização. O armazenamento em buffer também pode ajudar os aplicativos a renderizar frames com uma frequência um frame rate consistente, o que pode reduzir a interrupção visual causada renderização lenta da interface.

Preconditions

O armazenamento em buffer de imagem da câmera é ativado em qualquer uma das seguintes condições:

  1. Quando ativado pelo app chamando ArSession_setCameraTextureNames(ids) com vários IDs de textura.

  2. Quando um ou mais recursos do ARCore que exigem armazenamento em buffer interno são ativado. No momento, isso inclui os seguintes recursos:

    • Imagens aumentadas
    • Rostos aumentados
  3. Em alguns dispositivos compatíveis com o ARCore que exigem armazenamento em buffer interno para para funcionar corretamente.

Determinar se o atraso de frames está ativado

Para determinar se um determinado dispositivo e sessão de RA têm buffer de frames (também conhecido como atraso de frame) ativado, use a saída do 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.

Memória

Cada frame adicional da câmera em buffer aumenta o uso da memória. Por exemplo: uma textura de 1080p consome aproximadamente 6 MB de memória (obtida multiplicando-se um resolução de 1920 x 1080 por três bytes de dados RGB por pixel).

Considerações sobre desempenho

Não há garantia de que o uso de vários frames da câmera vai diminuir a variabilidade da frame rates e não há garantia de que o uso de um pipeline de renderização com várias linhas de execução melhorar o desempenho em todas as circunstâncias. Os fatores abaixo afetam desempenho no mundo real:

  • O pipeline de renderização do app

  • O modelo de linha de execução do app

  • A arquitetura de CPU do dispositivo

  • O sistema de programação do sistema operacional

Se o app não puder aproveitar os frames da câmera adicionais, não haverá vantagem de desempenho ao usar mais de uma textura.

Ativar o armazenamento em buffer

Para instruir o ARCore sobre quais texturas serão usadas para armazenar em buffer os frames da câmera recebidos, use ArSession_setCameraTextureNames(ids) para fornecer uma matriz de um ou mais IDs de textura. Essa função é chamada somente após a criação da sessão e geralmente é chamada apenas uma vez.

Durante cada chamada para ArSession_update(), o ARCore substitui a próxima textura em na fila em uma sequência round-robin. Se o app definir um único ID de textura, a mesma textura será substituída todas as vezes.

Use ArFrame_getCameraTextureName() para determinar o ID da textura associado com o frame atual.