Android 13 introduce una nuova configurazione chiamata
AutoSingleLayer
per l'aggancio di buffer non segnalati. Questa configurazione consente
a SurfaceFlinger di bloccare un buffer non segnalato quando viene aggiornato un solo livello.
Non si applica ai casi che si verificano tra i livelli, ad esempio modifiche alla geometria o transazioni di sincronizzazione.
In precedenza, il flag debug.sf.latch_unsignaled
in Android Open Source
Project (AOSP) consentiva a SurfaceFlinger di bloccare tutti i buffer non segnalati, indipendentemente
dal caso d'uso. Quando abiliti questa configurazione, possono verificarsi effetti collaterali indesiderati, ad esempio l'interruzione delle transazioni di sincronizzazione e il blocco dell'intero display durante l'attesa di buffer incompleti.
In modalità AutoSingleLayer
, SurfaceFlinger aggiorna solo un buffer di una singola
superficie in un frame. Questa modalità consente ai giochi e ad altre app a schermo intero di sfruttare
i buffer agganciati non segnalati e di ridurre i problemi di fluidità delle app senza essere interessati
dai blocchi dello schermo.
Impostazioni della modalità AutoSingleLayer
Per Android 13, AutoSingleLayer
è la modalità
predefinita per la funzionalità di buffer senza segnale del chiavistello. Questa modalità è controllata dalla
proprietà di sistema debug.sf.auto_latch_unsignaled
.
SurfaceFlinger legge LatchUnsignaledConfig
all'avvio. Le configurazioni
possibili sono:
LatchUnsignaledConfig::AutoSingleLayer
In questa modalità predefinita AOSP, SurfaceFlinger consente l'aggancio di buffer non segnalati quando un singolo livello viene aggiornato in un frame. L'aggiornamento deve includere solo un aggiornamento del buffer senza transazioni di sincronizzazione o modifiche alla geometria. Per impostazione predefinita, questa modalità imposta
debug.sf.auto_latch_unsignaled
sutrue
.LatchUnsignaledConfig::Disabled
Questa modalità disattiva il comportamento di blocco non segnalato e blocca solo le transazioni segnalate. Questa modalità disattiva anche la modalità
AutoSingleLayer
. Per configurare questa modalità, impostadebug.sf.latch_unsignaled
edebug.sf.auto_latch_unsignaled
sufalse
.LatchUnsignaledConfig::Always
In questa modalità, SurfaceFlinger blocca tutti i buffer non segnalati. Per configurare questa modalità, imposta
debug.sf.latch_unsignaled
sutrue
.
Test AutoSingleLayer
Per verificare se un buffer è agganciato senza segnale, cerca le seguenti tracce da SurfaceFlinger in Perfetto:
Figura 1. Traccia di un buffer agganciato non segnalato in Perfetto