Android 13 aggiunge una nuova configurazione chiamata
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 nei casi in cui si verificano tra i livelli, come le modifiche alla geometria o le transazioni di sincronizzazione.
Prima di Android 13, il flag debug.sf.latch_unsignaled
in AOSP consentiva a SurfaceFlinger di bloccare tutti i buffer non segnalati, indipendentemente dal caso d'uso. Quando questa configurazione è attivata, si verificano effetti collaterali indesiderati, come la rottura delle transazioni di sincronizzazione e il blocco dell'intero display in attesa di buffer incompleti.
Con la modalità AutoSingleLayer
, viene aggiornato solo un buffer di una singola superficie
in un frame. Questa modalità consente a giochi e altre app a schermo intero di usufruire del vantaggio di bloccare i buffer non segnalati e di ridurre il ritardo dell'app, senza essere interessata dai blocchi del display.
Impostazioni della modalità AutoSingleLayer
In Android 13,
AutoSingleLayer
è la modalità predefinita per la funzionalità del buffer latch non segnalato. Questa modalità è controllata dalla
proprietà di sistema debug.sf.auto_latch_unsignaled
.
SurfaceFlinger legge LatchUnsignaledConfig
all'avvio.
Di seguito sono riportate le possibili configurazioni:
LatchUnsignaledConfig::AutoSingleLayer
In questa modalità predefinita AOSP, il latching 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 alla geometria. In questa modalità,
debug.sf.auto_latch_unsignaled
è impostato sutrue
per impostazione predefinita.LatchUnsignaledConfig::Disabled
Questa modalità disattiva il comportamento di latch 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 bloccati non segnalati. Per configurare questa modalità, imposta
debug.sf.latch_unsignaled
sutrue
.
Test AutoSingleLayer
Per verificare se un buffer è latched senza segnalazione, cerca le seguenti tracce da SurfaceFlinger in Perfetto:
Figura 1. Traccia di un buffer non segnalato latched in Perfetto