In Android 13 wird eine neue Konfiguration namens
AutoSingleLayer zum Sperren von nicht signalisierten Puffern eingeführt. Mit dieser Konfiguration kann SurfaceFlinger einen nicht signalisierten Puffer sperren, wenn nur eine einzelne Ebene aktualisiert wird.
Sie gilt nicht für Fälle, die über mehrere Ebenen hinweg auftreten, z. B. Geometrieänderungen oder Synchronisierungstransaktionen.
Bisher konnte SurfaceFlinger mit dem Flag debug.sf.latch_unsignaled im Android Open Source Project (AOSP) alle nicht signalisierten Puffer sperren, unabhängig vom Anwendungsfall. Wenn Sie diese Konfiguration aktivieren, kann dies unerwünschte Nebenwirkungen haben, z. B. Synchronisierungstransaktionen unterbrechen und den gesamten Bildschirm einfrieren, während auf unvollständige Puffer gewartet wird.
Im Modus AutoSingleLayer aktualisiert SurfaceFlinger nur einen Puffer einer einzelnen Oberfläche in einem Frame. In diesem Modus können Spiele und andere Vollbild-Apps von der Sperrung nicht signalisierter Puffer profitieren und App-Ruckler reduzieren, ohne von Bildschirm-Freezes betroffen zu sein.
Einstellungen für den Modus „AutoSingleLayer“
In Android 13 ist AutoSingleLayer der Standard
modus für die Funktion zum Sperren nicht signalisierter Puffer. Dieser Modus wird durch die
Systemeigenschaft debug.sf.auto_latch_unsignaled gesteuert.
SurfaceFlinger liest LatchUnsignaledConfig beim Booten. Folgende Konfigurationen sind möglich:
LatchUnsignaledConfig::AutoSingleLayerIn diesem AOSP-Standardmodus erlaubt SurfaceFlinger das Sperren nicht signalisierter Puffer, wenn in einem Frame eine einzelne Ebene aktualisiert wird. Die Aktualisierung darf nur eine Pufferaktualisierung ohne Synchronisierungstransaktionen oder Geometrieänderungen umfassen. Standardmäßig wird in diesem Modus
debug.sf.auto_latch_unsignaledauftruegesetzt.LatchUnsignaledConfig::DisabledIn diesem Modus wird das Verhalten zum Sperren nicht signalisierter Puffer deaktiviert und nur signalisierte Transaktionen werden gesperrt. Außerdem wird der Modus
AutoSingleLayerdeaktiviert. Um diesen Modus zu konfigurieren, setzen Siedebug.sf.latch_unsignaledunddebug.sf.auto_latch_unsignaledauffalse.LatchUnsignaledConfig::AlwaysIn diesem Modus sperrt SurfaceFlinger alle nicht signalisierten Puffer. Um diesen Modus zu konfigurieren, setzen Sie
debug.sf.latch_unsignaledauftrue.
AutoSingleLayer testen
Wenn Sie testen möchten, ob ein Puffer nicht signalisiert gesperrt ist, suchen Sie in Perfetto nach den folgenden Traces von SurfaceFlinger:
Abbildung 1 : Trace eines nicht signalisiert gesperrten Puffers in Perfetto