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 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::AutoSingleLayer

    W 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_unsignaled na true.

  • LatchUnsignaledConfig::Disabled

    Ten 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, ustaw debug.sf.latch_unsignaled i debug.sf.auto_latch_unsignaled na false.

  • LatchUnsignaledConfig::Always

    W tym trybie SurfaceFlinger zatrzaskuje wszystkie bufory bez sygnału. Aby skonfigurować ten tryb, ustaw debug.sf.latch_unsignaled na true.

Testowanie 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 zatrzaskiwanego bufora bez sygnału w Perfetto