Unsignalisiertes Buffer-Latch mit AutoSingleLayer

In Android 13 wurde eine neue Konfiguration namens AutoSingleLayer zum Erfassen nicht signalisierter Puffer hinzugefügt. Mit dieser Konfiguration kann SurfaceFlinger einen nicht signalisierten Puffer sperren, wenn nur eine einzelne Ebene aktualisiert wird, nicht jedoch in Fällen, die über mehrere Ebenen hinweg auftreten, z. B. bei Geometrieänderungen oder Synchronisierungsvorgängen.

Vor Android 13 konnte SurfaceFlinger mit dem Flag debug.sf.latch_unsignaled in AOSP alle nicht signalisierten Puffer unabhängig vom Anwendungsfall erfassen. Wenn diese Konfiguration aktiviert ist, kann es zu unerwünschten Nebeneffekten kommen, z. B. zu abgebrochenen Synchronisierungsvorgängen und einem eingefrorenen Display, während auf unvollständige Puffer gewartet wird.

Im Modus AutoSingleLayer wird in einem Frame nur ein Puffer einer einzelnen Oberfläche aktualisiert. In diesem Modus können Spiele und andere Vollbild-Apps nicht signalisierte Puffer nutzen und App-Ruckeln reduzieren, ohne dass es zu Display-Freezes kommt.

Einstellungen für den AutoSingleLayer-Modus

In 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 ist das Verriegeln von nicht signalisierten Puffern zulässig, wenn in einem Frame eine einzelne Ebene aktualisiert wird und die Aktualisierung nur eine Pufferaktualisierung ohne Synchronisierungsvorgänge oder Geometrieänderungen umfasst. In diesem Modus ist debug.sf.auto_latch_unsignaled standardmäßig auf true eingestellt.

  • 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ür debug.sf.latch_unsignaled und debug.sf.auto_latch_unsignaled den Wert false fest.

  • LatchUnsignaledConfig::Always

    In diesem Modus werden alle Puffer ohne Signalübertragung verriegelt. Um diesen Modus zu konfigurieren, legen Sie für debug.sf.latch_unsignaled den Wert true fest.

Test AutoSingleLayer

Wenn Sie testen möchten, ob ein Puffer ohne Signal latched wird, suchen Sie in Perfetto nach den folgenden SurfaceFlinger-Traces:

Trace des zwischengespeicherten, nicht signalisierten Puffers

Abbildung 1: Trace eines verriegelten, nicht signalisierten Puffers in Perfetto