Frame-Pacing

Die Android Frame Pacing Library, auch bekannt als Swappy, ist Teil des Android Game SDK. Sie hilft OpenGL und Vulkan-Spielen, auf Android ein reibungsloses Rendering und eine korrekte Frame-Pacing zu erzielen.

Frame-Pacing ist die Synchronisierung der Logik und des Rendering-Loops eines Spiels mit dem Display-Subsystem und der zugrunde liegenden Display-Hardware eines Betriebssystems. Das Android-Display-Subsystem wurde entwickelt, um bestimmte visuelle Artefakte wie Tearing zu vermeiden. Das Display-Subsystem vermeidet Tearing, indem es Folgendes tut:

  • Vergangene Frames intern puffern
  • Verspätete Frame-Übermittlungen erkennen
  • Den aktuellen Frame weiter anzeigen, wenn ein verspäteter Frame erkannt wird

Inkonsistente Frame-Anzeigezeiten werden dadurch verursacht, dass der Rendering-Loop eines Spiels mit einer anderen Rate ausgeführt wird, als die native Display-Hardware unterstützt. Probleme treten auf, wenn der Rendering-Loop eines Spiels zu langsam für die zugrunde liegende Display-Hardware ist, was zu inkonsistenten Anzeigezeiten führt. Wenn beispielsweise ein Spiel mit 30 fps versucht, auf einem Gerät zu rendern, das nativ 60 fps unterstützt, führt der Rendering-Loop des Spiels dazu, dass ein wiederholter Frame 16 ms länger auf dem Bildschirm bleibt. Diese Art von Disconnect führt zu erheblichen Inkonsistenzen bei den Frame-Zeiten, z. B. 33 ms, 16 ms und 49 ms. Übermäßig komplexe Szenen verschärfen dieses Problem noch, da sie dazu führen, dass Frames verloren gehen.

Die Frame Pacing Library führt folgende Aufgaben aus:

  • Kompensiert Ruckeln aufgrund kurzer Game-Frames.
  • Verwendet Synchronisierungs-Fences für lange Frames, die zu Ruckeln und Latenz führen.
    • Fügt der App Wartezeiten hinzu. Dadurch kann die Display-Pipeline aufholen anstatt dass sich ein Rückstau aufbaut.
    • Verwendet Synchronisierungs-Fences (EGL_KHR_fence_sync und VkFence).
  • Wählt eine Aktualisierungsrate aus, um Flexibilität und eine reibungslose Präsentation zu ermöglichen, wenn Ihr Gerät mehrere Aktualisierungsraten unterstützt.
  • Stellt Statistiken für das Debugging und die Profilerstellung mithilfe von Frame Statistiken bereit.

Informationen zum Konfigurieren der Bibliothek für den Betrieb in verschiedenen Modi finden Sie unter Unterstützte Betriebsmodi.

Informationen zur Implementierung mit OpenGL-Renderer oder Vulkan-Renderer finden Sie unter:

Weitere Informationen finden Sie unter Frame Pacing Library.

Eingriff zur Drosselung der Bilder pro Sekunde

Durch den Eingriff zur Drosselung der Bilder pro Sekunde (FPS) können Spiele mit einer angemessenen FPS-Rate ausgeführt werden. Dazu sind nur Änderungen auf Plattformseite erforderlich und es ist keine Aktion von Entwicklern erforderlich.

Bei der Implementierung des Eingriffs zur Drosselung der FPS werden die folgenden Komponenten verwendet.

GameManagerService

Die Komponente GameManagerService verwaltet alle Informationen zu Spielmodus und Spieleingriffen pro Nutzer und Spiel. Die FPS-Informationen werden im GameManagerService zusammen mit anderen Informationen zu Eingriffen gespeichert, z. B. dem Faktor für die Reduzierung der Auflösung, in einer <PACKAGE_NAME, Interventions> Zuordnung für jedes Nutzerprofil. Auf die FPS-Informationen wird zugegriffen, wenn der Spielmodus geändert oder der Eingriff aktualisiert wird. A UID ist für jeden PACKAGE_NAME und Nutzer eindeutig und kann weiter in ein <UID, Frame Rate> Paar übersetzt werden, um an den SurfaceFlinger zu senden.

SurfaceFlinger

Die Komponente SurfaceFlinger unterstützt bereits die Drosselung der FPS einer Anwendung, solange die Frame-Rate ein Teiler der Aktualisierungsrate des Displays ist. Im Falle eines VSync prüft der SurfaceFlinger die Gültigkeit des VSync für die gedrosselte Anwendung, indem er prüft, ob der VSync-Zeitstempel mit der Frame-Rate der Anwendung übereinstimmt. Wenn die Frame-Rate nicht mit dem VSync übereinstimmt, hält der SurfaceFlinger den Frame an, bis die Frame-Rate und der VSync übereinstimmen.

Die folgende Abbildung beschreibt die Interaktion zwischen dem GameManagerService und dem SurfaceFlinger:

Interaktion zwischen GameManagerService und SurfaceFlinger

Abbildung 1 : Interaktion zwischen dem GameServiceManager und dem SurfaceFlinger.

Der SurfaceFlinger verwaltet ein <UID, Frame Rate> Paar Zuordnung, um eine neue Priorität für die Drosselung der Frame-Rate festzulegen. Die UID ist für Nutzer und Spiele eindeutig, sodass jeder Nutzer auf einem einzelnen Gerät unterschiedliche Einstellungen für die Frame-Rate für dasselbe Spiel haben kann. Um die Frame-Rate eines Spiels zu drosseln, ruft der GameManagerService den SurfaceFlinger auf, um die Frame-Rate für eine UID zu überschreiben. Mit diesem Mechanismus aktualisiert der SurfaceFlinger die Zuordnung, wenn der Spielmodus geändert oder der Eingriff aktualisiert wird. Der SurfaceFlinger verarbeitet die FPS-Änderung, indem er die Puffer entsprechend sperrt.

Weitere Informationen zur Drosselung der FPS finden Sie unter Drosselung der FPS.