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:
Quando ativado pelo app, chamando
ArSession_setCameraTextureNames(ids)
com vários IDs de textura.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
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.