In Android 13 wird eine neue Konfiguration namens AutoSingleLayer
zum Laschen nicht signalisierter Puffer hinzugefügt. Mit dieser Konfiguration kann SurfaceFlinger einen nicht signalisierten Puffer sperren, wenn nur eine einzelne Ebene aktualisiert wird, und nicht für Fälle, die sich über mehrere Ebenen erstrecken, z. B. Geometrieänderungen oder Synchronisationstransaktionen.
Vor Android 13 konnte SurfaceFlinger mit dem Flag debug.sf.latch_unsignaled
in AOSP alle nicht signalisierten Puffer unabhängig vom Anwendungsfall sperren. Wenn diese Konfiguration aktiviert ist, kann es zu unerwünschten Nebenwirkungen kommen, z. B. zu unterbrochenen Synchronisationstransaktionen und zum Einfrieren des gesamten Displays, während auf unvollständige Puffer gewartet wird.
Im AutoSingleLayer
-Modus wird in einem Frame nur ein Puffer einer einzelnen Oberfläche aktualisiert. In diesem Modus können Spiele und andere Vollbild-Apps von nicht signalisierten Puffern profitieren und Ruckler reduzieren, ohne dass es zu Bildschirmfrieren kommt.
Einstellungen für den Modus „AutoSingleLayer“
In Android 13 ist AutoSingleLayer
der Standardmodus für die Funktion „Zwischenspeicher nicht signalisiert“. Dieser Modus wird über die Systemeigenschaft debug.sf.auto_latch_unsignaled
gesteuert.
SurfaceFlinger liest beim Starten LatchUnsignaledConfig
.
Folgende Konfigurationen sind möglich:
LatchUnsignaledConfig::AutoSingleLayer
In diesem AOSP-Standardmodus ist das Laschen nicht signalisierter Puffer zulässig, wenn eine einzelne Ebene in einem Frame aktualisiert wird und das Update nur eine Pufferaktualisierung ohne Synchronisationstransaktionen oder Geometrieänderungen umfasst. In diesem Modus ist
debug.sf.auto_latch_unsignaled
standardmäßig auftrue
festgelegt.LatchUnsignaledConfig::Disabled
In diesem Modus wird das Verhalten der Lasche ohne Signal deaktiviert und nur gesignalisierte Transaktionen werden geschaltet. In diesem Modus wird auch der
AutoSingleLayer
-Modus deaktiviert. Wenn Sie diesen Modus konfigurieren möchten, 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 latched. Wenn Sie diesen Modus konfigurieren möchten, legen Sie für
debug.sf.latch_unsignaled
den Werttrue
fest.
Test AutoSingleLayer
Wenn Sie prüfen möchten, ob ein Puffer ohne Signal latched ist, suchen Sie in Perfetto nach den folgenden Spuren von SurfaceFlinger:
Abbildung 1. Trace eines ladbaren, nicht signalisierten Buffers in Perfetto