Frame-Taktung

Die Android Frame Pacing Library, auch Swappy genannt, ist Teil des Android Game SDK. Sie hilft bei OpenGL- und Vulkan-Spielen, ein flüssiges Rendering und eine korrekte Frame-Taktfrequenz auf Android-Geräten zu erreichen.

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

  • Bisherige Frames intern puffern
  • Erkennen von verspäteten Frame-Einreichungen
  • Der aktuelle Frame wird weiterhin angezeigt, wenn ein verspäteter Frame erkannt wird

Inkonsistente Frame-Darstellungszeiten werden durch den Render-Loop eines Spiels verursacht, der mit einer anderen Rate als der von der nativen Displayhardware unterstützten ausgeführt wird. Probleme treten auf, wenn der Rendering-Loop eines Spiels zu langsam für die zugrunde liegende Displayhardware läuft, was zu inkonsistenten Anzeigezeiten führt. Wenn ein Spiel beispielsweise mit 30 fps auf einem Gerät gerendert wird, das nativ 60 fps unterstützt, bleibt ein wiederholter Frame aufgrund des Rendering-Loops des Spiels 16 ms länger auf dem Bildschirm. Diese Art der Unterbrechung führt zu erheblichen Inkonsistenzen bei den Frameraten, z. B. 33 ms, 16 ms, 49 ms usw. Zu komplexe Szenen verschlimmern dieses Problem, da sie zu fehlenden Frames führen.

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

  • Kompensiert Ruckler aufgrund kurzer Spielframes.
  • Verwendet Synchronisationsschranken für lange Frames, was zu Rucklern und Latenz führt.
    • Wartezeiten in die App einfügen. Dadurch kann die Displaypipeline aufholen, anstatt dass sich ein Rückstau bildet.
    • Verwendet Synchronisierungsschranken (EGL_KHR_fence_sync und VkFence).
  • Wählt eine Bildwiederholrate aus, um Flexibilität und eine flüssige Darstellung zu ermöglichen, wenn Ihr Gerät mehrere Bildwiederholraten unterstützt.
  • Stellt Statistiken für die Fehlerbehebung und das Profiling mithilfe von Frame-Statistiken bereit.

Informationen dazu, wie Sie die Bibliothek für den Betrieb in verschiedenen Modi konfigurieren, finden Sie unter Unterstützte Betriebsmodi.

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

Weitere Informationen finden Sie unter Richtige Frame-Taktfrequenz erreichen.

Drosselung der Bildrate

Durch die FPS-Drosselung (Frames per Second) können Spiele mit nur platformseitigen Änderungen und ohne jegliche Maßnahmen seitens der Entwickler mit einer angemessenen FPS-Rate abgespielt werden.

Für die Implementierung der FPS-Drosselung werden die folgenden Komponenten verwendet:

GameManagerService

Die Komponente GameManagerService verwaltet alle Informationen zum Spielmodus und zur Spieleingriffsfunktion pro Nutzer und pro Spiel. Die Informationen zur Framerate werden im GameManagerService zusammen mit anderen Informationen zu Eingriffen, z. B. dem Faktor für die Auflösungsverringerung, in einer <PACKAGE_NAME, Interventions>-Zuordnung für jedes Nutzerprofil gespeichert. Auf die Informationen zur Framerate wird zugegriffen, wenn der Spielmodus geändert oder die Intervention aktualisiert wird. Ein UID ist für jeden PACKAGE_NAME und Nutzer eindeutig und kann in ein <UID, Frame Rate>-Paar umgewandelt werden, das an SurfaceFlinger gesendet wird.

SurfaceFlinger

Die Komponente SurfaceFlinger unterstützt bereits die Drosselung der FPS einer Anwendung, solange die Bildrate ein Teiler der Displayaktualisierungsrate ist. Bei einem vsync prüft SurfaceFlinger die Gültigkeit des vsync für die gedrosselte Anwendung, indem er überprüft, ob der vsync-Zeitstempel mit der Framerate der Anwendung synchron ist. Wenn die Framerate nicht synchron mit der VSync ist, hält der SurfaceFlinger den Frame, bis die Framerate und die VSync synchron sind.

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

Interaktion zwischen dem GameManagerService und dem SurfaceFlinger

Abbildung 1: Interaktion zwischen dem GameServiceManager und SurfaceFlinger

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

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