Frame-Tempo

Die Android Frame Pacing-Bibliothek, auch bekannt als Swappy, ist Teil des Android Game SDK . Es hilft OpenGL- und Vulkan- Spielen, eine reibungslose Wiedergabe und korrekte Frame-Pacing auf Android zu erreichen.

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

  • Interne Pufferung vergangener Frames
  • Erkennen verspäteter Frame-Übermittlungen
  • Das aktuelle Bild wird weiterhin angezeigt, wenn ein spätes Bild erkannt wird

Inkonsistente Frame-Anzeigezeiten werden dadurch verursacht, dass die Renderschleife eines Spiels mit einer anderen Geschwindigkeit läuft, als die native Anzeigehardware unterstützt. Probleme treten auf, wenn die Renderschleife eines Spiels für die zugrunde liegende Anzeigehardware zu langsam läuft, 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 die Renderschleife des Spiels dazu, dass ein wiederholter Frame weitere 16 ms auf dem Bildschirm verbleibt. Diese Art der Trennung führt zu erheblichen Inkonsistenzen bei den Frame-Zeiten wie 33 ms, 16 ms, 49 ms usw. Übermäßig komplexe Szenen verschärfen dieses Problem noch, da sie dazu führen, dass Frames fehlen.

Die Frame Pacing-Bibliothek führt folgende Aufgaben aus:

  • Kompensiert Stottern aufgrund kurzer Spielframes.
  • Verwendet Synchronisierungsgrenzen für lange Frames, die zu Stottern und Latenz führen.
    • Fügt Wartezeiten in die App ein. Dadurch kann die Anzeigeleitung aufholen, anstatt dass sich ein Gegendruck aufbaut.
    • Verwendet Synchronisierungs-Fences ( EGL_KHR_fence_sync und VkFence ).
  • Wählt eine Bildwiederholfrequenz, um Flexibilität und eine reibungslose Präsentation zu gewährleisten, wenn Ihr Gerät mehrere Bildwiederholfrequenzen unterstützt.
  • Stellt Statistiken zum Debuggen und Profilieren mithilfe von Frame-Statistiken bereit.

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

Informationen zur Implementierung mithilfe des OpenGL-Renderers oder Vulkan-Renderers finden Sie unter

Weitere Informationen finden Sie unter Erzielen der richtigen Frame-Pacing .

Drosselungseingriff für Bilder pro Sekunde

Durch die Drosselung der Frames pro Sekunde (FPS) können Spiele mit einem angemessenen FPS-Tempo laufen, wobei nur plattformseitige Änderungen erforderlich sind und keine Maßnahmen seitens der Entwickler erforderlich sind.

Die Implementierung des FPS-Drosselungseingriffs nutzt die folgenden Komponenten:

GameManagerService

Die GameManagerService- Komponente verwaltet alle benutzer- und spielbezogenen Informationen zum Spielmodus und zum Spieleingriff. Die FPS-Informationen werden im GameManagerService zusammen mit anderen Interventionsinformationen, z. B. dem Auflösungs-Downscaling-Faktor, in einer <PACKAGE_NAME, Interventions> -Zuordnung für jedes Benutzerprofil gespeichert. Auf die FPS-Informationen wird zugegriffen, wenn der Spielmodus geändert oder der Eingriff aktualisiert wird. Eine UID ist für jeden PACKAGE_NAME und Benutzer eindeutig und kann weiter in ein <UID, Frame Rate> -Paar übersetzt werden, um es an den SurfaceFlinger zu senden.

SurfaceFlinger

Die SurfaceFlinger- Komponente unterstützt bereits die Drosselung der FPS einer Anwendung, solange die Bildrate ein Teiler der Bildwiederholfrequenz ist. Im Falle eines Vsync prüft der SurfaceFlinger die Gültigkeit des Vsync für die gedrosselte Anwendung, indem er überprüft, ob der Vsync-Zeitstempel mit der Bildrate der Anwendung in Phase ist. Wenn die Bildrate nicht mit dem vsync phasengleich ist, hält der SurfaceFlinger den Frame, bis die Bildrate und der vsync phasengleich sind.

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

Interaktion zwischen dem GameManagerService und dem SurfaceFlinger

Abbildung 1. Interaktion zwischen GameServiceManager und SurfaceFlinger

Der SurfaceFinger verwaltet eine <UID, Frame Rate> -Paarzuordnung, um eine neue Framerate-Drosselungspriorität festzulegen. Die UID ist zwischen Benutzern und Spielen eindeutig, sodass jeder Benutzer auf einem einzelnen Gerät unterschiedliche Bildrateneinstellungen für dasselbe Spiel haben kann. Um die Bildrate eines Spiels zu drosseln, ruft der GameServiceManager den SurfaceFlinger auf, um die Bildrate für eine UID zu überschreiben. Mit diesem Mechanismus aktualisiert der SurfaceFlinger die Zuordnung immer dann, wenn der Spielmodus geändert oder der Eingriff aktualisiert wird. Der SurfaceFlinger verarbeitet die FPS-Änderung, indem er Puffer entsprechend zwischenspeichert.

Weitere Informationen zur FPS-Drosselung finden Sie in der Einführung zur FPS-Drosselung .