Android 13 wprowadza nową konfigurację o nazwie
AutoSingleLayer do zatrzaskiwania buforów bez sygnału. Ta konfiguracja umożliwia SurfaceFlinger zatrzaskiwanie bufora bez sygnału, gdy aktualizowana jest tylko jedna warstwa.
Nie dotyczy to przypadków, które występują w różnych warstwach, np. zmian geometrii lub transakcji synchronizacji.
Wcześniej flaga debug.sf.latch_unsignaled w projekcie Android Open Source Project (AOSP) umożliwiała SurfaceFlinger zatrzaskiwanie wszystkich buforów bez sygnału niezależnie od przypadku użycia. Włączenie tej konfiguracji może powodować niepożądane skutki uboczne, np. przerywanie transakcji synchronizacji i zawieszanie całego wyświetlacza podczas oczekiwania na niekompletne bufory.
W trybie AutoSingleLayer SurfaceFlinger aktualizuje tylko bufor jednej powierzchni w klatce. Ten tryb umożliwia grom i innym aplikacjom pełnoekranowym korzystanie z zatrzaskiwania buforów bez sygnału i zmniejszanie liczby zacięć aplikacji, a jednocześnie nie wpływa na zawieszanie się wyświetlacza.
Ustawienia trybu AutoSingleLayer
W Androidzie 13 AutoSingleLayer jest domyślnym
trybem funkcji zatrzaskiwania buforów bez sygnału. Ten tryb jest kontrolowany przez właściwość systemu
debug.sf.auto_latch_unsignaled.
SurfaceFlinger odczytuje LatchUnsignaledConfig podczas uruchamiania. Dostępne konfiguracje:
LatchUnsignaledConfig::AutoSingleLayerW tym domyślnym trybie AOSP SurfaceFlinger zezwala na zatrzaskiwanie buforów bez sygnału, gdy w klatce aktualizowana jest jedna warstwa. Aktualizacja musi obejmować tylko aktualizację bufora bez transakcji synchronizacji ani zmian geometrii. Domyślnie, ten tryb ustawia
debug.sf.auto_latch_unsignalednatrue.LatchUnsignaledConfig::DisabledTen tryb wyłącza zatrzaskiwanie buforów bez sygnału i zatrzaskuje tylko transakcje z sygnałem. Ten tryb wyłącza też tryb
AutoSingleLayer. Aby skonfigurować ten tryb, ustawdebug.sf.latch_unsignaledidebug.sf.auto_latch_unsignalednafalse.LatchUnsignaledConfig::AlwaysW tym trybie SurfaceFlinger zatrzaskuje wszystkie bufory bez sygnału. Aby skonfigurować ten tryb, ustaw
debug.sf.latch_unsignalednatrue.
Testowanie AutoSingleLayer
Aby sprawdzić, czy bufor jest zatrzaskiwany bez sygnału, poszukaj w Perfetto tych śladów z SurfaceFlinger:
Rysunek 1. Ślad zatrzaskiwanego bufora bez sygnału w Perfetto