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, il sistema non eliminava questa cache del 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 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 la massima quantità di memoria. I dispositivi che eseguono l'upgrade alla versione 14 e successive possono utilizzare anche questa opzione 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 nel file 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. Ciò comporta un risparmio di memoria per tutti gli slot eliminati, ad eccezione dello slot 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 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 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 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 numero inferiore 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 più comandi setLayerBuffer per l'implementazione compatibile con le versioni precedenti. Tuttavia, questo non deve essere considerato un test sufficiente per il corretto funzionamento, poiché alcuni dispositivi superano questi test VTS, ma non superano i test durante gli scenari di utilizzo reali.

Per i nuovi test VTS, consulta i seguenti link: