Ridurre il consumo di memoria grafica

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

Scegli una delle due seguenti opzioni:

  • Per i dispositivi lanciati con Android 14 e versioni successive, devi implementare la nuova API HAL di Composer 3.2. Questa opzione è attiva per impostazione predefinita e consente di risparmiare la maggior parte della memoria. Anche i dispositivi di cui viene eseguito l'upgrade alla versione 14 e successive possono utilizzare questa opzione per usufruire di tutti i vantaggi della memoria.
  • Per i dispositivi di cui vuoi eseguire 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.

Implementa l'API Composer HAL 3.2

Per usufruire di tutti i vantaggi della memoria buffer della grafica, devi:

  1. Aggiorna l'implementazione HAL di Composer alla versione 3.2.
  2. Esegui il processo LayerCommand::bufferSlotsToClear svuotando la cache del buffer delle voci indicate dai numeri di slot trovati nell'elenco.

Le API Composer HAL 3.2 relative alla memoria del buffer grafico, tra cuiLayerCommand:bufferSlotsToClear, sono inLayerCommand.aidl-.

Attiva 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 un conseguente risparmio di memoria per tutti gli slot svuotati, ad eccezione dell'attuale slot del buffer attivo. Per ottenere un risparmio parziale della memoria, attiva l'opzione compatibile con le versioni precedenti impostando surface_flinger.clear_slots_with_set_layer_buffer sysprop su true. Questa proprietà sysprop si trova nel fileproperty_contexts.

L'impostazione di questa proprietà sys richiede che l'implementazione HAL di Composer gestisca correttamente più comandi setLayerBuffer per lo stesso livello in un unico 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, ciascuna con un singolo BufferCommand. Ogni BufferCommand contiene un handle del buffer del segnaposto 1x1 e un numero di slot per lo slot del buffer della cache che deve essere svuotato.

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

L'opzione compatibile con le versioni precedenti potrebbe causare l'arresto anomalo dell'HAL di Composer su alcuni dispositivi. Potresti riuscire a risolvere il problema modificando l'HAL di Composer. Il codice che controlla questo comportamento è disponibile 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 un numero inferiore di errori di esaurimento della memoria in 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 in grado di ricevere le nuove chiamate API (versione HAL 3.2 e 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, poiché alcuni dispositivi superano questi test VTS, ma non passano i casi d'uso reali.

Per i nuovi test VTS, vai ai seguenti link: