Buffer dei frame della fotocamera

Aggiunto in ARCore 1.17.0

La maggior parte delle app deve eseguire il buffering di un solo fotogramma della fotocamera per il rendering. Tuttavia, ARCore supporta anche il buffering di più frame della videocamera in una coda di texture round-robin di dimensioni fisse.

Le app con una pipeline di rendering multithread possono utilizzare il buffering per migliorare le prestazioni di rendering. Il buffering può anche aiutare le app a eseguire il rendering dei frame a una frequenza fotogrammi più coerente, il che può ridurre gli stuttering visivi causati da rendering lento dell'interfaccia utente.

Preconditions

Il buffering delle immagini della videocamera viene attivato in una delle seguenti condizioni:

  1. Se attivato dall'app chiamando Session.setCameraTextureNames(ids) con più ID texture.

  2. Quando sono abilitate una o più funzionalità ARCore che richiedono il buffering interno. Al momento sono incluse le seguenti funzioni:

    • Immagini aumentate
    • Volti aumentati
  3. Su alcuni dispositivi supportati da ARCore che richiedono il buffering interno per funzionare correttamente.

Determina se il ritardo di frame è abilitato

Per determinare se per un determinato dispositivo e sessione AR è abilitato il buffering dei frame (noto anche come ritardo frame), utilizza l'output 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.

Memoria

Ogni ulteriore frame della videocamera sottoposto a buffer aumenta l'utilizzo della memoria. Ad esempio, una trama da 1080p consuma circa 6 MB di memoria (ottenuta moltiplicando una risoluzione di 1920 x 1080 per tre byte di dati RGB per pixel).

Considerazioni sul rendimento

Non è garantito che l'utilizzo di più frame della videocamera riduca la variabilità delle frequenze fotogrammi e l'utilizzo di una pipeline di rendering multithread non garantisce prestazioni migliori in tutte le circostanze. I seguenti fattori influiscono sulle prestazioni reali:

  • Pipeline di rendering dell'app

  • Il modello di threading dell'app

  • L'architettura della CPU del dispositivo

  • Il sistema di pianificazione del sistema operativo

Se la tua app non è in grado di utilizzare fotogrammi della fotocamera aggiuntivi, l'utilizzo di più texture non offre vantaggi in termini di prestazioni.

Abilita buffering

Per indicare ad ARCore quali texture utilizzare per il buffer dei fotogrammi della fotocamera in arrivo, usa Session.setCameraTextureNames(ids) per fornire un array di uno o più ID texture. Questa funzione viene richiamata solo dopo la creazione della sessione e di solito viene richiamata solo una volta.

Durante ogni chiamata a Session.update(), ARCore sovrascrive la texture successiva nella coda in una sequenza round-robin. Se l'app imposta un solo ID texture, la stessa texture verrà sovrascritta ogni volta.

Utilizza Frame.getCameraTextureName() per determinare l'ID texture associato al frame corrente.