Ridurre il consumo di memoria grafica

Nello stack grafico, una cache buffer per livello si trova tra Composer HAL e SurfaceFlinger per ridurre l'overhead associato all'invio di descrittori di file tramite IPC. Prima di Android 14, questa cache del buffer non veniva eliminata quando un GraphicBufferProducer si disconnette da un GraphicBufferConsumer SurfaceFlinger, ad esempio quando un MediaCodec viene disconnesso da una SurfaceView. A partire da Android 14, puoi eliminare forzatamente questa cache del buffer per ridurre il consumo di memoria grafica.

Scegli una delle due opzioni seguenti:

  • Per i dispositivi lanciati con Android 14 e versioni successive, devi implementare la nuova API HAL Composer versione 3.2. Questa opzione è attiva per impostazione predefinita e consente di risparmiare più memoria. I dispositivi che eseguono l'upgrade ad Android 14 e versioni successive possono utilizzare questa opzione anche per ottenere tutti i vantaggi della memoria.
  • Per i dispositivi che eseguono l'upgrade ad Android 14 per i quali non vuoi implementare l'API Composer HAL 3.2, puoi abilitare l'opzione compatibile con le versioni precedenti. Questa opzione consente di risparmiare quasi la stessa quantità di memoria dell'opzione precedente.

Le due sezioni seguenti spiegano come implementare ogni opzione.

Implementare l'API Composer HAL 3.2

Per ottenere tutti i vantaggi della memoria buffer grafica, devi:

  1. Aggiorna l'implementazione di Composer HAL alla versione 3.2.
  2. Elabora LayerCommand::bufferSlotsToClear eliminando le voci della cache del buffer indicate dai numeri di slot presenti nell'elenco.

Le API Composer HAL 3.2 relative alla memoria del buffer grafico, incluso LayerCommand:bufferSlotsToClear, si trovano in LayerCommand.aidl-.

Attivare l'opzione compatibile con le versioni precedenti

L'opzione di riduzione della memoria compatibile con le versioni precedenti sostituisce un buffer reale nello slot della cache con un buffer segnaposto 1x1, con conseguente risparmio di memoria per tutti gli slot eliminati, ad eccezione dello slot del buffer attivo corrente. Per ottenere vantaggi parziali del risparmio di memoria, attiva l'opzione compatibile con le versioni precedenti impostando la proprietà di sistema surface_flinger.clear_slots_with_set_layer_buffer su true. Questa proprietà di sistema si trova nel file property_contexts.

L'impostazione di questa proprietà di sistema richiede che l'implementazione di Composer HAL gestisca correttamente più comandi setLayerBuffer per lo stesso livello in un singolo ciclo di presentazione.

L'attivazione dell'opzione compatibile con le versioni precedenti ha i seguenti effetti:

  • Per gli HAL AIDL: SurfaceFlinger invia più istanze di LayerCommand per un singolo livello, ognuna con un singolo BufferCommand. Ogni BufferCommand contiene un buffer segnaposto 1x1 e un numero di slot per lo slot del buffer della cache che deve essere eliminato.

  • Per gli HAL HIDL: SurfaceFlinger invia più comandi SELECT_DISPLAY, SELECT_LAYER, SET_BUFFER. Questi comandi contengono un handle del buffer segnaposto 1x1 e un numero di slot per lo slot del buffer della cache che deve essere eliminato.

L'opzione compatibile con le versioni precedenti potrebbe causare l'arresto anomalo di Composer HAL su alcuni dispositivi. Potresti riuscire a risolvere il problema modificando l'HAL di Composer. Il codice che controlla questo comportamento si trova qui:

Testare il consumo di memoria della cache del buffer grafico

I test non possono verificare se gli slot della cache vengono eliminati dalle implementazioni HAL. Tuttavia, puoi utilizzare gli strumenti di debug per monitorare l'utilizzo del buffer grafico. Durante il monitoraggio, dovresti notare che si verificano meno errori di memoria insufficiente negli scenari in cui più video diversi vengono interrotti e avviati in rapida successione su YouTube.

Sono disponibili test VTS che verificano che l'implementazione HAL sia funzionalmente in grado di ricevere le nuove chiamate API (HAL versione 3.2+) o più comandi setLayerBuffer per l'implementazione compatibile con le versioni precedenti. Tuttavia, questo non deve essere considerato un test sufficiente per il corretto funzionamento, in quanto alcuni dispositivi superano questi test VTS, ma non riescono a superare i casi d'uso reali.

Per i nuovi test VTS, vai ai seguenti link: