In Android 13 wird eine neue Konfiguration namens AutoSingleLayer
zum Verriegeln nicht signalisierter Puffer eingeführt. Mit dieser Konfiguration kann SurfaceFlinger einen nicht signalisierten Puffer sperren, wenn nur ein einzelnes Layer aktualisiert wird.
Sie gilt nicht für Fälle, die über mehrere Ebenen hinweg auftreten, z. B. Geometrieänderungen oder Synchronisierungsvorgänge.
Bisher konnte SurfaceFlinger mit dem Flag debug.sf.latch_unsignaled
im Android Open Source Project (AOSP) alle nicht signalisierten Puffer unabhängig vom Anwendungsfall sperren. Wenn Sie diese Konfiguration aktivieren, kann dies zu unerwünschten Nebenwirkungen führen, z. B. zu abgebrochenen Synchronisierungsvorgängen und einem eingefrorenen Display, während auf unvollständige Puffer gewartet wird.
Im AutoSingleLayer
-Modus aktualisiert SurfaceFlinger in einem Frame nur einen Puffer einer einzelnen Oberfläche. In diesem Modus können Spiele und andere Vollbild-Apps von der Verriegelung nicht signalisierter Puffer und der Reduzierung von App-Rucklern profitieren, ohne dass es zu Display-Freezes kommt.
Einstellungen für den AutoSingleLayer-Modus
Unter 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 erlaubt SurfaceFlinger das Latching von nicht signalisierten Puffern, wenn in einem Frame eine einzelne Ebene aktualisiert wird. Das Update darf nur eine Pufferaktualisierung ohne Synchronisierungstransaktionen oder Geometrieänderungen enthalten. In diesem Modus wird
debug.sf.auto_latch_unsignaled
standardmäßig auftrue
festgelegt.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 nicht signalisierten Puffer von SurfaceFlinger verriegelt. Um diesen Modus zu konfigurieren, legen Sie für
debug.sf.latch_unsignaled
den Werttrue
fest.
AutoSingleLayer testen
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