Android 13 dodaje nową konfigurację o nazwie AutoSingleLayer
do blokowania niesygnalizowanych buforów. Ta konfiguracja umożliwia SurfaceFlingerowi zablokowanie bufora bez sygnalizacji, gdy aktualizowana jest tylko pojedyncza warstwa, a nie w przypadkach, które występują między warstwami, takich jak zmiany geometrii lub transakcje synchronizacji.
Przed Androidem 13 flaga debug.sf.latch_unsignaled
w AOSP pozwala SurfaceFlingerowi zablokować wszystkie niesygnalizowane bufory, niezależnie od przypadku użycia. Gdy ta konfiguracja jest włączona, występują niepożądane efekty uboczne, takie jak przerwanie transakcji synchronizacji i zamrożenie całego ekranu podczas oczekiwania na niepełne bufory.
W trybie AutoSingleLayer
w ramce aktualizowany jest tylko bufor pojedynczej powierzchni. Ten tryb umożliwia grom i innym aplikacjom pełnoekranowym czerpanie korzyści z blokowania niesygnalizowanych buforów i zmniejszania przestojów aplikacji, pozostając niewrażliwymi na zawieszanie się ekranu.
Ustawienia trybu AutoSingleLayer
W systemie Android 13 AutoSingleLayer
jest trybem domyślnym funkcji bufora bez sygnalizacji zatrzasku. Ten tryb jest kontrolowany przez właściwość systemową debug.sf.auto_latch_unsignaled
.
SurfaceFlinger odczytuje LatchUnsignaledConfig
podczas rozruchu. Oto możliwe konfiguracje:
LatchUnsignaledConfig::AutoSingleLayer
W tym domyślnym trybie AOSP blokowanie niesygnalizowanych buforów jest dozwolone, gdy pojedyncza warstwa jest aktualizowana w ramce, a aktualizacja obejmuje tylko aktualizację bufora bez transakcji synchronizacji lub zmian geometrii. W tym trybie
debug.sf.auto_latch_unsignaled
jest domyślnie ustawiony natrue
.LatchUnsignaledConfig::Disabled
Ten tryb wyłącza zachowanie niesygnalizowanych zatrzasków i blokuje tylko sygnalizowane transakcje. Ten tryb wyłącza również tryb
AutoSingleLayer
. Aby skonfigurować ten tryb, ustawdebug.sf.latch_unsignaled
idebug.sf.auto_latch_unsignaled
nafalse
.LatchUnsignaledConfig::Always
W tym trybie wszystkie bufory są zatrzaskiwane bez sygnalizacji. Aby skonfigurować ten tryb, ustaw
debug.sf.latch_unsignaled
natrue
.
Przetestuj AutoSingleLayer
Aby sprawdzić, czy bufor jest zablokowany bez sygnalizacji, poszukaj następujących śladów z SurfaceFlinger w Perfetto :
Rysunek 1. Ślad zatrzaśniętego niesygnalizowanego bufora w Perfetto