In Android 13 wurde eine neue Konfiguration namens AutoSingleLayer
zum Erfassen nicht signalisierter Puffer hinzugefügt. Mit dieser Konfiguration kann SurfaceFlinger einen nicht signalisierten Puffer sperren, wenn nur eine einzelne Ebene aktualisiert wird, nicht jedoch in Fällen, die über mehrere Ebenen hinweg auftreten, z. B. bei Geometrieänderungen oder Synchronisierungsvorgängen.
Vor Android 13 konnte SurfaceFlinger mit dem Flag debug.sf.latch_unsignaled
in AOSP alle nicht signalisierten Puffer unabhängig vom Anwendungsfall erfassen. Wenn diese Konfiguration aktiviert ist, kann es zu unerwünschten Nebeneffekten kommen, z. B. zu abgebrochenen Synchronisierungsvorgängen und einem eingefrorenen Display, während auf unvollständige Puffer gewartet wird.
Im Modus AutoSingleLayer
wird in einem Frame nur ein Puffer einer einzelnen Oberfläche aktualisiert. In diesem Modus können Spiele und andere Vollbild-Apps nicht signalisierte Puffer nutzen und App-Ruckeln reduzieren, ohne dass es zu Display-Freezes kommt.
Einstellungen für den AutoSingleLayer-Modus
In Android 13 ist AutoSingleLayer
der Standardmodus für die Funktion „Latch unsignaled buffer“. Dieser Modus wird über die Systemeigenschaft debug.sf.auto_latch_unsignaled
gesteuert.
SurfaceFlinger liest LatchUnsignaledConfig
beim Booten.
Folgende Konfigurationen sind möglich:
LatchUnsignaledConfig::AutoSingleLayer
In diesem AOSP-Standardmodus ist das Verriegeln von nicht signalisierten Puffern zulässig, wenn in einem Frame eine einzelne Ebene aktualisiert wird und die Aktualisierung nur eine Pufferaktualisierung ohne Synchronisierungsvorgänge oder Geometrieänderungen umfasst. In diesem Modus ist
debug.sf.auto_latch_unsignaled
standardmäßig auftrue
eingestellt.LatchUnsignaledConfig::Disabled
In diesem Modus wird das Verhalten des nicht signalisierten Verriegelns deaktiviert und es werden nur signalisierte Transaktionen verriegelt. In diesem Modus wird auch der
AutoSingleLayer
-Modus deaktiviert. Um diesen Modus zu konfigurieren, legen Sie fürdebug.sf.latch_unsignaled
unddebug.sf.auto_latch_unsignaled
den Wertfalse
fest.LatchUnsignaledConfig::Always
In diesem Modus werden alle Puffer ohne Signalübertragung verriegelt. Um diesen Modus zu konfigurieren, legen Sie für
debug.sf.latch_unsignaled
den Werttrue
fest.
Test AutoSingleLayer
Wenn Sie testen möchten, ob ein Puffer ohne Signal latched wird, suchen Sie in Perfetto nach den folgenden SurfaceFlinger-Traces:
Abbildung 1: Trace eines verriegelten, nicht signalisierten Puffers in Perfetto