Nello stack grafico, una cache del buffer per livello si trova tra Composer HAL e
SurfaceFlinger per ridurre l'overhead associato all'invio dei descrittori dei file
su IPC. Prima di Android 14, questa cache del buffer
non veniva eliminata quando un
GraphicBufferProducer
si disconnetteva da un SurfaceFlinger
GraphicBufferConsumer
, ad esempio quando un MediaCodec si disconnetteva 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 è attivata per impostazione predefinita e consente di risparmiare più memoria. Anche i dispositivi che eseguono l'upgrade alla versione 14 e successive possono utilizzare questa opzione per usufruire di tutti i vantaggi della memoria.
- Per i dispositivi che eseguono l'upgrade ad Android 14 per cui non vuoi implementare l'API Composer HAL 3.2, puoi abilitare l'opzione di compatibilità con le versioni precedenti. Questa opzione consente di risparmiare memoria quasi quanta memoria rispetto all'opzione precedente.
Le due sezioni seguenti spiegano come implementare ciascuna opzione.
Implementa l'API Composer HAL 3.2
Per ottenere tutti i vantaggi della memoria framebuffer grafica, devi:
- Aggiorna l'implementazione di Composer HAL alla versione 3.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-
.
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 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 singoloBufferCommand
. OgniBufferCommand
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 gli HAL HIDL: SurfaceFlinger invia più comandi
SELECT_DISPLAY
,SELECT_LAYER
eSET_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 di compatibilità 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 minore 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 o versioni successive) o più comandi setLayerBuffer
per l'implementazione compatibile con le versioni precedenti. Tuttavia, questo non dovrebbe essere considerato test sufficiente per
la corretta funzionalità, poiché alcuni dispositivi superano questi test VTS,
ma non vanno a buon fine nei casi d'uso reali.
Per i nuovi test VTS, vai ai seguenti link:
Compatibile con HIDL:
GraphicsComposerHidlCommandTest::SET_LAYER_BUFFER_multipleTimes
Compatibile con AIDL 3.1:
GraphicsComposerAidlCommandTest::SetLayerBufferMultipleTimes
AIDL 3.2:
GraphicsComposerAidlCommandV2Test::SetLayerBufferSlotsToClear