Niesygnalizowane blokowanie bufora z AutoSingleLayer

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

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

  • LatchUnsignaledConfig::Always

    W tym trybie wszystkie bufory są zatrzaskiwane bez sygnalizacji. Aby skonfigurować ten tryb, ustaw debug.sf.latch_unsignaled na true .

Przetestuj AutoSingleLayer

Aby sprawdzić, czy bufor jest zablokowany bez sygnalizacji, poszukaj następujących śladów z SurfaceFlinger w Perfetto :

Ślad zablokowanego bufora bez sygnalizacji

Rysunek 1. Ślad zatrzaśniętego niesygnalizowanego bufora w Perfetto