Nicht signalisiertes Zwischenspeichern mit AutoSingleLayer

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 auf true 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ü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 latched. Wenn Sie diesen Modus konfigurieren möchten, legen Sie für debug.sf.latch_unsignaled den Wert true 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:

Trace eines ladbaren, nicht signalisierten Buffers

Abbildung 1. Trace eines ladbaren, nicht signalisierten Buffers in Perfetto