Android 13 dodaje nową konfigurację o nazwie AutoSingleLayer
, która służy do blokowania niesygnalizowanych buforów. Ta konfiguracja umożliwia SurfaceFlingerowi blokowanie niezarejestrowanego bufora, gdy aktualizowana jest tylko jedna warstwa, a nie w przypadkach, które występują w różnych warstwach, takich jak zmiany geometrii czy transakcje synchronizacji.
Przed Androidem 13 flaga debug.sf.latch_unsignaled
w AOSP pozwalała usługom SurfaceFlinger przechwytywać wszystkie niesygnalizowane bufory niezależnie od przypadku użycia. Gdy ta konfiguracja jest włączona, występują niepożądane skutki uboczne, takie jak przerywanie transakcji synchronizacji i zawieszanie całego wyświetlacza podczas oczekiwania na niekompletne bufory.
W trybie AutoSingleLayer
aktualizowany jest tylko bufor pojedynczej powierzchni w ramce. Tryb ten umożliwia korzystanie z buforów bez sygnalizacji w przypadku gier i innych aplikacji pełnoekranowych, a także ogranicza zacięcia aplikacji, nie wpływając na wyświetlacz.
Ustawienia trybu Autopojedynczego warstwy
W Androidzie 13 domyślnym trybem funkcji bufora bez sygnałów zatrzasku jest AutoSingleLayer
. Tym trybem steruje usługa systemowa debug.sf.auto_latch_unsignaled
.
SurfaceFlinger odczytuje wartość LatchUnsignaledConfig
podczas uruchamiania.
Możliwe konfiguracje:
LatchUnsignaledConfig::AutoSingleLayer
W tym trybie domyślnym AOSP blokowanie nie sygnalizowanych buforów jest dozwolone, gdy w ramce jest aktualizowana pojedyncza warstwa, a aktualizacja obejmuje tylko aktualizację bufora bez transakcji synchronizacji ani zmian geometrii. W tym trybie domyślna wartość parametru
debug.sf.auto_latch_unsignaled
totrue
.LatchUnsignaledConfig::Disabled
Ten tryb wyłącza niesygnalizowane działanie zatrzasku i tylko sygnalizowane transakcje. Tryb ten wyłącza też tryb
AutoSingleLayer
. Aby skonfigurować ten tryb, ustawdebug.sf.latch_unsignaled
idebug.sf.auto_latch_unsignaled
nafalse
.LatchUnsignaledConfig::Always
W tym trybie wszystkie bufory są blokowane bez sygnalizacji. Aby skonfigurować ten tryb, ustaw wartość
debug.sf.latch_unsignaled
natrue
.
Test AutoSingleLayer
Aby sprawdzić, czy bufor jest blokowany bez sygnału, poszukaj tych śladów w SurfaceFlinger w Perfetto:
Rysunek 1. Ślad zablokowanego bufora niesygnalnego w Perfetto