Latch del buffer non segnalato con AutoSingleLayer

Android 13 aggiunge una nuova configurazione chiamata AutoSingleLayer per il blocco dei buffer non segnalati. Questa configurazione consente a SurfaceFlinger di bloccare un buffer non segnalato quando si aggiorna solo un singolo livello e non per i casi che si verificano tra livelli, come modifiche della geometria o transazioni di sincronizzazione.

Prima di Android 13, il flag debug.sf.latch_unsignaled in AOSP consente a SurfaceFlinger di bloccare tutti i buffer non segnalati, indipendentemente dal caso d'uso. Quando questa configurazione è abilitata, si verificano effetti collaterali indesiderati, come l'interruzione delle transazioni di sincronizzazione e il congelamento dell'intero display durante l'attesa di buffer incompleti.

Con la modalità AutoSingleLayer , in un frame viene aggiornato solo un buffer di una singola superficie. Questa modalità consente ai giochi e ad altre app a schermo intero di ottenere il vantaggio di bloccare buffer non segnalati e ridurre il rallentamento delle app rimanendo inalterati dai blocchi del display.

Impostazioni della modalità AutoSingleLayer

In Android 13, AutoSingleLayer è la modalità predefinita per la funzionalità latch del buffer senza segnale. Questa modalità è controllata dalla proprietà di sistema debug.sf.auto_latch_unsignaled .

SurfaceFlinger legge LatchUnsignaledConfig all'avvio. Ecco le possibili configurazioni:

  • LatchUnsignaledConfig::AutoSingleLayer

    In questa modalità predefinita AOSP, il blocco dei buffer non segnalati è consentito quando un singolo livello viene aggiornato in un frame e l'aggiornamento include solo un aggiornamento del buffer senza transazioni di sincronizzazione o modifiche della geometria. In questa modalità, debug.sf.auto_latch_unsignaled è impostato su true per impostazione predefinita.

  • LatchUnsignaledConfig::Disabled

    Questa modalità disabilita il comportamento di latch non segnalato e blocca solo le transazioni segnalate. Questa modalità disabilita anche la modalità AutoSingleLayer . Per configurare questa modalità, impostare debug.sf.latch_unsignaled e debug.sf.auto_latch_unsignaled su false .

  • LatchUnsignaledConfig::Always

    In questa modalità, tutti i buffer vengono bloccati senza segnalazione. Per configurare questa modalità, impostare debug.sf.latch_unsignaled su true .

Prova AutoSingleLayer

Per verificare se un buffer è bloccato senza segnale, cerca le seguenti tracce da SurfaceFlinger in Perfetto :

Traccia del buffer non segnalato bloccato

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