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 Session.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 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 costuma ser chamada apenas uma vez.

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