Android 13 dodaje nową konfigurację o nazwie AutoSingleLayer
do blokowania niesygnalizowanych buforów. Ta konfiguracja umożliwia SurfaceFlingerowi zablokowanie niesygnalizowanego bufora podczas aktualizacji tylko jednej warstwy, a nie w przypadkach występujących między warstwami, takich jak zmiany geometrii lub transakcje synchronizacji.
Przed Androidem 13 flaga debug.sf.latch_unsignaled
w AOSP umożliwia SurfaceFlingerowi zablokowanie wszystkich niesygnalizowanych buforów, niezależnie od przypadku użycia. Gdy ta konfiguracja jest włączona, występują niepożądane skutki uboczne, takie jak przerwanie transakcji synchronizacji i zablokowanie całego wyświetlacza podczas oczekiwania na niekompletne bufory.
W trybie AutoSingleLayer
w ramce aktualizowany jest tylko bufor pojedynczej powierzchni. Ten tryb umożliwia grom i innym aplikacjom pełnoekranowym korzystanie z blokowania niesygnalizowanych buforów i ograniczanie szarpnięć aplikacji, bez wpływu na zawieszanie się ekranu.
Ustawienia trybu AutoSingleLayer
W systemie Android 13 AutoSingleLayer
jest trybem domyślnym dla funkcji zatrzaskowego bufora bez sygnału. 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 ani zmian geometrii. W tym trybie
debug.sf.auto_latch_unsignaled
ma domyślnie wartośćtrue
.LatchUnsignaledConfig::Disabled
Ten tryb wyłącza blokowanie niesygnalizowanych zachowań i blokuje tylko sygnalizowane transakcje. Ten tryb wyłącza także 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 sygnału. Aby skonfigurować ten tryb, ustaw
debug.sf.latch_unsignaled
natrue
.
Przetestuj AutoSingleLayer
Aby sprawdzić, czy bufor jest zatrzaskiwany bez sygnału, poszukaj następujących śladów z SurfaceFlinger w Perfetto :
Rysunek 1. Ślad zablokowanego, niesygnalizowanego bufora w Perfetto