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 sutrue
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à, impostaredebug.sf.latch_unsignaled
edebug.sf.auto_latch_unsignaled
sufalse
.LatchUnsignaledConfig::Always
In questa modalità, tutti i buffer vengono bloccati senza segnalazione. Per configurare questa modalità, impostare
debug.sf.latch_unsignaled
sutrue
.
Prova AutoSingleLayer
Per verificare se un buffer è bloccato senza segnale, cerca le seguenti tracce da SurfaceFlinger in Perfetto :
Figura 1. Traccia di un buffer non segnalato bloccato in Perfetto