Nie sygnalizowane blokowanie bufora za pomocą AutoSingleLayer

Android 13 wprowadza nową konfigurację o nazwie AutoSingleLayer do zatrzaskiwania buforów bez sygnału. Ta konfiguracja umożliwia SurfaceFlingerowi zatrzaskiwanie nieoznaczonego bufora, gdy aktualizowana jest tylko jedna warstwa, a nie w przypadkach, które występują w różnych warstwach, takich jak zmiany geometrii lub transakcje synchronizacji.

W AOSP przed Androidem 13 flaga debug.sf.latch_unsignaled umożliwia usłudze SurfaceFlinger blokowanie wszystkich buforów bez sygnału, niezależnie od przypadku użycia. Gdy ta konfiguracja jest włączona, występują niepożądane efekty uboczne, takie jak przerywanie transakcji synchronizacji i zawieszanie całego wyświetlacza podczas oczekiwania na niekompletne bufory.

W trybie AutoSingleLayer w ramce aktualizowany jest tylko bufor jednej powierzchni. Ten tryb umożliwia grom i innym aplikacjom pełnoekranowym korzystanie z zalet blokowania nieoznaczonych buforów i ograniczania zacinania się aplikacji, a jednocześnie pozostaje odporny na zamrażanie wyświetlacza.

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. Oto możliwe konfiguracje:

  • LatchUnsignaledConfig::AutoSingleLayer

    W tym domyślnym trybie AOSP zatrzaskiwanie nieoznaczonych buforów jest dozwolone, gdy w ramce aktualizowana jest pojedyncza warstwa, a aktualizacja obejmuje tylko aktualizację bufora bez transakcji synchronizacji ani zmian geometrii. W tym trybie domyślnie parametr debug.sf.auto_latch_unsignaled jest ustawiony 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_unsignaleddebug.sf.auto_latch_unsignaled na false.

  • LatchUnsignaledConfig::Always

    W tym trybie wszystkie bufory są zatrzaskiwane bez sygnału. Aby skonfigurować ten tryb, ustaw wartość debug.sf.latch_unsignaled na true.

Test AutoSingleLayer

Aby sprawdzić, czy bufor jest zatrzaskiwany bez sygnału, poszukaj w Perfetto tych śladów z SurfaceFlinger:

Ślad zatrzaśniętego bufora bez sygnału

Rysunek 1. Ślad zatrzaśniętego bufora bez sygnału w Perfetto