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