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 Session.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 Session.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 Session.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 Frame.getCameraTextureName() para determinar o ID da textura associado com o frame atual.