Ridurre il consumo di memoria grafica

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

Scegli tra una delle due seguenti opzioni:

  • Per i dispositivi avviati con Android 14 e versioni successive, è necessario implementare la nuova versione 3.2 dell'API HAL Composer. Questa opzione è attivata per impostazione predefinita e consente di risparmiare più memoria. Anche i dispositivi aggiornati alla versione 14 e successive possono utilizzare questa opzione per ottenere i vantaggi della memoria completa.
  • Per i dispositivi che eseguono l'aggiornamento ad Android 14 per i quali non desideri implementare l'API Composer HAL 3.2, puoi abilitare l'opzione di compatibilità 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 ciascuna opzione.

Implementare l'API Composer HAL 3.2

Per ottenere tutti i vantaggi della memoria del buffer grafico, è necessario:

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

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

Abilita l'opzione di compatibilità 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 di risparmio parziale della memoria, abilitare l'opzione di compatibilità con le versioni precedenti impostando il sysprop surface_flinger.clear_slots_with_set_layer_buffer su true . Questo sysprop si trova nel file property_contexts .

L'impostazione di questo sysprop richiede che l'implementazione HAL di Composer gestisca correttamente più comandi setLayerBuffer per lo stesso livello in un singolo ciclo presente.

L'abilitazione dell'opzione di compatibilità con le versioni precedenti ha i seguenti effetti:

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

  • Per 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 dell'HAL di Composer su alcuni dispositivi. Potresti essere in grado di modificare l'HAL del compositore per risolvere questo problema. Il codice che controlla questo comportamento si trova qui:

Testare il consumo di memoria 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 dovrebbe essere considerato un test sufficiente per garantire il corretto funzionamento, poiché alcuni dispositivi superano questi test VTS, ma falliscono durante i casi d'uso reali.

Per i nuovi test VTS, accedere ai seguenti collegamenti: