Android 13 fügt eine neue Konfiguration namens AutoSingleLayer
zum Zwischenspeichern nicht signalisierter Puffer hinzu. Diese Konfiguration ermöglicht es SurfaceFlinger, einen nicht signalisierten Puffer zwischenzuspeichern, wenn nur eine einzelne Ebene aktualisiert wird, und nicht für Fälle, die über Ebenen hinweg auftreten, wie etwa Geometrieänderungen oder Synchronisierungstransaktionen.
Vor Android 13 ermöglicht das Flag debug.sf.latch_unsignaled
in AOSP, dass SurfaceFlinger alle nicht signalisierten Puffer zwischenspeichert, unabhängig vom Anwendungsfall. Wenn diese Konfiguration aktiviert ist, treten unerwünschte Nebenwirkungen auf, z. B. das Unterbrechen von Synchronisierungstransaktionen und das Einfrieren der gesamten Anzeige beim Warten auf unvollständige Puffer.
Im AutoSingleLayer
Modus wird nur ein Puffer einer einzelnen Oberfläche in einem Frame aktualisiert. In diesem Modus können Spiele und andere Vollbild-Apps von der Sperrung nicht signalisierter Puffer profitieren und App-Ruckler reduzieren, ohne dass die Anzeige einfriert.
Einstellungen für den AutoSingleLayer-Modus
In Android 13 ist AutoSingleLayer
der Standardmodus für die Latch-Unsignaled-Buffer-Funktion. Dieser Modus wird durch die Systemeigenschaft debug.sf.auto_latch_unsignaled
gesteuert.
SurfaceFlinger liest LatchUnsignaledConfig
beim Booten. Hier sind die möglichen Konfigurationen:
LatchUnsignaledConfig::AutoSingleLayer
In diesem AOSP-Standardmodus ist das Zwischenspeichern nicht signalisierter Puffer zulässig, wenn eine einzelne Ebene in einem Frame aktualisiert wird und die Aktualisierung nur eine Pufferaktualisierung ohne Synchronisierungstransaktionen oder Geometrieänderungen umfasst. In diesem Modus ist
debug.sf.auto_latch_unsignaled
standardmäßig auftrue
gesetzt.LatchUnsignaledConfig::Disabled
In diesem Modus wird das nicht signalisierte Verhalten zwischengespeichert und nur signalisierte Transaktionen zwischengespeichert. Dieser Modus deaktiviert auch den
AutoSingleLayer
Modus. Um diesen Modus zu konfigurieren, setzen Siedebug.sf.latch_unsignaled
unddebug.sf.auto_latch_unsignaled
auffalse
.LatchUnsignaledConfig::Always
In diesem Modus werden alle Puffer ohne Signal verriegelt. Um diesen Modus zu konfigurieren, setzen Sie
debug.sf.latch_unsignaled
auftrue
.
Testen Sie AutoSingleLayer
Um zu testen, ob ein Puffer ohne Signal verriegelt ist, suchen Sie in Perfetto nach den folgenden Spuren von SurfaceFlinger:
Abbildung 1. Spur eines verriegelten, nicht signalisierten Puffers in Perfetto