Ridurre il consumo di memoria grafica

Nello stack grafico, una cache di 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, il sistema non eliminava questa cache di buffer quando un GraphicBufferProducer si disconnetteva da GraphicBufferConsumer di SurfaceFlinger, ad esempio quando un MediaCodec si disconnetteva da un SurfaceView. A partire da Android 14, puoi eliminare forzatamente questa cache di 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 versione 3.2 dell'API Composer HAL. Questa opzione si attiva per impostazione predefinita e salva la quantità massima di memoria. I dispositivi che eseguono l'upgrade ad Android 14 e versioni successive possono anche utilizzare questa opzione per sfruttare appieno 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 attivare 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 sfruttare appieno i vantaggi della memoria del buffer grafico, devi:

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

Le API Composer HAL 3.2 correlate alla memoria del buffer grafico, inclusa LayerCommand::bufferSlotsToClear, si trovano nel LayerCommand.aidl file.

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. In questo modo si risparmia memoria per tutti gli slot eliminati, ad eccezione dello slot del buffer attivo corrente. Per ottenere vantaggi parziali in termini di 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 property_contexts file.

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 LayerCommand per un singolo livello, ognuna con un singolo BufferCommand. Ogni BufferCommand contiene un handle del buffer segnaposto 1x1 e un numero di slot per lo slot del buffer della cache che richiede l'eliminazione.

  • 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 richiede l'eliminazione.

L'opzione compatibile con le versioni precedenti potrebbe causare l'arresto anomalo di Composer HAL su alcuni dispositivi. Potresti essere in grado di modificare Composer HAL per risolvere il problema. 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 le implementazioni HAL eliminano gli slot della cache. Tuttavia, puoi utilizzare gli strumenti di debug per monitorare l'utilizzo del buffer grafico. Durante il monitoraggio, potresti notare un minor numero di errori di memoria insufficiente negli scenari in cui più video diversi vengono interrotti e avviati rapidamente 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 successive) o più comandi setLayerBuffer per l'implementazione compatibile con le versioni precedenti. Tuttavia, questo non deve essere considerato un test sufficiente per la funzionalità corretta, in quanto alcuni dispositivi superano questi test VTS, ma non riescono a superare i casi d'uso reali.

Per i nuovi test VTS, consulta i seguenti link: