Android 13 wprowadza nową konfigurację o nazwie AutoSingleLayer do zatrzaskiwania nieoznaczonych buforów. Ta konfiguracja umożliwia SurfaceFlinger zatrzaśnięcie nieoznaczonego bufora, 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 spowodować niepożądane efekty uboczne, np. przerwanie transakcji synchronizacji i zawieszenie całego wyświetlacza podczas oczekiwania na niekompletne bufory.
W trybie AutoSingleLayer usługa SurfaceFlinger aktualizuje w ramce tylko bufor jednej powierzchni. Ten tryb umożliwia grom i innym aplikacjom pełnoekranowym korzystanie z buforów bez sygnału i ograniczanie zacinania się aplikacji, a jednocześnie nie wpływa na zamrażanie ekranu.
Ustawienia trybu AutoSingleLayer
W Androidzie 13 AutoSingleLayer jest domyślnym trybem funkcji bufora bez sygnału zatrzasku. Ten tryb jest kontrolowany przez właściwość systemu debug.sf.auto_latch_unsignaled.
Usługa SurfaceFlinger odczytuje LatchUnsignaledConfig podczas uruchamiania. Możliwe konfiguracje:
- LatchUnsignaledConfig::AutoSingleLayer- W tym domyślnym trybie AOSP SurfaceFlinger zezwala na zatrzaskiwanie nieoznaczonych buforów, gdy w ramce aktualizowana jest pojedyncza warstwa. Aktualizacja musi zawierać tylko aktualizację bufora bez transakcji synchronizacji ani zmian geometrii. Domyślnie w tym trybie wartość - debug.sf.auto_latch_unsignaledjest ustawiona na- true.
- LatchUnsignaledConfig::Disabled- W tym trybie wyłączone jest zachowanie zatrzasku bez sygnału, a zatrzaskuje on tylko transakcje z sygnałem. Ten tryb wyłącza też tryb - AutoSingleLayer. Aby skonfigurować ten tryb, ustaw wartości- debug.sf.latch_unsignaledi- debug.sf.auto_latch_unsignaledna- false.
- LatchUnsignaledConfig::Always- W tym trybie SurfaceFlinger zatrzaskuje wszystkie bufory bez sygnału. Aby skonfigurować ten tryb, ustaw wartość - debug.sf.latch_unsignaledna- true.
Test AutoSingleLayer
Aby sprawdzić, czy bufor jest zatrzaskiwany bez sygnału, poszukaj w Perfetto tych śladów z SurfaceFlinger:
 
 
Rysunek 1. Ślad zatrzaśniętego bufora bez sygnału w Perfetto
