Android 13 aggiunge 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 e non per i casi che si verificano
tra i livelli, come modifiche alla 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, ad esempio l'interruzione delle transazioni di sincronizzazione e il blocco 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 sfruttare
i vantaggi dell'aggancio dei buffer non segnalati e di ridurre i problemi delle app senza essere interessati
dai blocchi dello schermo.
Impostazioni della modalità AutoSingleLayer
In Android 13,
AutoSingleLayer
è la modalità
predefinita per la funzionalità di buffer senza segnale di blocco. 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, l'aggancio di 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 alla geometria. In questa modalità,
debug.sf.auto_latch_unsignaled
è impostato sutrue
per impostazione predefinita.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à, tutti i buffer vengono agganciati senza segnale. 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