Latch del buffer non segnalato con AutoSingleLayer

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::AutoSingleLayer

    In 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_unsignaled su true.

  • LatchUnsignaledConfig::Disabled

    Questa 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à, imposta debug.sf.latch_unsignaled e debug.sf.auto_latch_unsignaled su false.

  • LatchUnsignaledConfig::Always

    In questa modalità, SurfaceFlinger blocca tutti i buffer non segnalati. Per configurare questa modalità, imposta debug.sf.latch_unsignaled su true.

Testare AutoSingleLayer

Per verificare se un buffer è bloccato non segnalato, cerca le seguenti tracce di SurfaceFlinger in Perfetto:

Traccia del buffer agganciato senza segnale

Figura 1. Traccia di un buffer non segnalato bloccato in Perfetto