Unsignalisiertes Buffer-Latch mit AutoSingleLayer

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::AutoSingleLayer

    In 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_unsignaled auf true gesetzt.

  • LatchUnsignaledConfig::Disabled

    In diesem Modus wird das Verhalten zum Sperren nicht signalisierter Puffer deaktiviert und nur signalisierte Transaktionen werden gesperrt. Außerdem wird der Modus AutoSingleLayer deaktiviert. Um diesen Modus zu konfigurieren, setzen Sie debug.sf.latch_unsignaled und debug.sf.auto_latch_unsignaled auf false.

  • LatchUnsignaledConfig::Always

    In diesem Modus sperrt SurfaceFlinger alle nicht signalisierten Puffer. Um diesen Modus zu konfigurieren, setzen Sie debug.sf.latch_unsignaled auf true.

AutoSingleLayer testen

Wenn Sie testen möchten, ob ein Puffer nicht signalisiert gesperrt ist, suchen Sie in Perfetto nach den folgenden Traces von SurfaceFlinger:

Trace des zwischengespeicherten, nicht signalisierten Puffers

Abbildung 1 : Trace eines nicht signalisiert gesperrten Puffers in Perfetto