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::AutoSingleLayerIn 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_unsignaledstandardmäßig auftruefestgelegt.LatchUnsignaledConfig::DisabledIn 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_unsignaledunddebug.sf.auto_latch_unsignaledden Wertfalsefest.LatchUnsignaledConfig::AlwaysIn diesem Modus werden alle nicht signalisierten Puffer von SurfaceFlinger verriegelt. Um diesen Modus zu konfigurieren, legen Sie für
debug.sf.latch_unsignaledden Werttruefest.
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