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 uma fila de textura round-robin de tamanho fixo.

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 da renderização. O armazenamento em buffer também pode ajudar os apps a renderizar frames a um frame rate mais consistente, o que pode reduzir a oscilação visual causada por 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 buffer interno estão ativados. No momento, isso inclui os seguintes recursos:

    • Imagens aumentadas
    • Rostos aumentados
  3. Em determinados dispositivos com suporte ao ARCore que exigem armazenamento em buffer interno para funcionar corretamente.

Determinar se o atraso do frame está ativado

Para determinar se um determinado dispositivo e uma sessão de RA têm o armazenamento em 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 extra da câmera armazenado em buffer aumenta o uso da memória. Por exemplo, uma textura de 1.080p consome aproximadamente 6 MB de memória, o que é conseguido multiplicando uma resolução de 1.920 x 1.080 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 dos frames. Além disso, não há garantia de que o uso de um pipeline de renderização com várias linhas de execução vai melhorar o desempenho em todas as circunstâncias. Os fatores abaixo afetam o desempenho no mundo real:

  • O pipeline de renderização do app

  • Modelo de linha de execução do app

  • A arquitetura da CPU do dispositivo

  • O sistema de programação do sistema operacional

Caso o app não consiga aproveitar os demais frames da câmera, não haverá vantagem no desempenho do uso de mais de uma textura.

Ativar o armazenamento em buffer

Para instruir o ARCore sobre quais texturas usar para armazenar em buffer os frames recebidos da câmera, 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 costuma ser chamada apenas uma vez.

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

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