Nicht signalisierte Pufferverriegelung mit AutoSingleLayer

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 auf true 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 Sie debug.sf.latch_unsignaled und debug.sf.auto_latch_unsignaled auf false .

  • LatchUnsignaledConfig::Always

    In diesem Modus werden alle Puffer ohne Signal verriegelt. Um diesen Modus zu konfigurieren, setzen Sie debug.sf.latch_unsignaled auf true .

Testen Sie AutoSingleLayer

Um zu testen, ob ein Puffer ohne Signal verriegelt ist, suchen Sie in Perfetto nach den folgenden Spuren von SurfaceFlinger:

Spur eines verriegelten, nicht signalisierten Puffers

Abbildung 1. Spur eines verriegelten, nicht signalisierten Puffers in Perfetto