Niesygnalizowane blokowanie bufora z AutoSingleLayer

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

  • LatchUnsignaledConfig::Always

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

Przetestuj AutoSingleLayer

Aby sprawdzić, czy bufor jest zatrzaskiwany bez sygnału, poszukaj następujących śladów z SurfaceFlinger w Perfetto :

Ślad zablokowanego, niesygnalizowanego bufora

Rysunek 1. Ślad zablokowanego, niesygnalizowanego bufora w Perfetto