Android 13 introduce una nuova configurazione denominata
AutoSingleLayer per bloccare i 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, può causare effetti collaterali indesiderati, ad esempio l'interruzione delle transazioni di sincronizzazione e il blocco dell'intero display durante l'attesa di buffer incompleti.
Nella 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 il blocco dei buffer non segnalati e di ridurre il jank dell'app senza essere interessati dai blocchi del display.
Impostazioni della modalità AutoSingleLayer
Per Android 13, AutoSingleLayer è la modalità predefinita
per la funzionalità di blocco dei buffer non segnalati. Questa modalità è controllata dalla
proprietà di sistema debug.sf.auto_latch_unsignaled.
SurfaceFlinger legge LatchUnsignaledConfig all'avvio. Le configurazioni possibili sono:
LatchUnsignaledConfig::AutoSingleLayerIn questa modalità predefinita di AOSP, SurfaceFlinger consente di bloccare i buffer non segnalati quando viene aggiornato un singolo livello 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_unsignaledsutrue.LatchUnsignaledConfig::DisabledQuesta modalità disabilita il comportamento di blocco non segnalato e blocca solo le transazioni segnalate. Questa modalità disabilita anche la modalità
AutoSingleLayer. Per configurare questa modalità, impostadebug.sf.latch_unsignalededebug.sf.auto_latch_unsignaledsufalse.LatchUnsignaledConfig::AlwaysIn questa modalità, SurfaceFlinger blocca tutti i buffer non segnalati. Per configurare questa modalità, imposta
debug.sf.latch_unsignaledsutrue.
Testare AutoSingleLayer
Per verificare se un buffer è bloccato non segnalato, cerca le seguenti tracce di SurfaceFlinger in Perfetto:
Figura 1. Traccia di un buffer non segnalato bloccato in Perfetto