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ù fotogrammi della fotocamera di dimensioni fisse la coda della texture round-robin.

Le app con una pipeline di rendering multithread possono utilizzare il buffering per migliorare delle prestazioni di rendering. Il buffering può anche aiutare le app a eseguire il rendering dei frame a un una frequenza fotogrammi più elevata, che può ridurre lo stuttering della vista causato da rendering lento dell'interfaccia utente.

Preconditions

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

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

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

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

Determina se il ritardo frame è abilitato

Per determinare se un determinato dispositivo e una determinata sessione AR hanno il buffering dei frame (anche noto come ritardo frame) abilitato, 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 frame della fotocamera aggiuntivo presente nel buffer aumenta l'utilizzo della memoria. Ad esempio: una texture da 1080p consuma circa 6 MB di memoria (ottenuta moltiplicando risoluzione di 1920 x 1080 con 3 byte di dati RGB per pixel).

Considerazioni sulle prestazioni

Non è garantito che l'utilizzo di più cornici della fotocamera riduca la variabilità delle le frequenze fotogrammi e l'utilizzo di una pipeline di rendering multithread offrire prestazioni migliori in tutte le circostanze. Sono interessati i seguenti fattori prestazioni realistiche:

  • La pipeline di rendering dell'app

  • Il modello di thread delle app

  • L'architettura della CPU del dispositivo

  • Il sistema di pianificazione del sistema operativo

Se la tua app non è in grado di sfruttare inquadrature aggiuntive, non: in termini di prestazioni grazie all'uso di più texture.

Attiva buffer

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

Durante ogni chiamata a Session.update(), ARCore sovrascrive la texture successiva in la coda in una sequenza di tipo 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 con il frame corrente.