Frame-Taktung

Die Android Frame Pacing-Bibliothek, auch als Swappy bezeichnet, ist Teil des Android Game SDK. Damit können OpenGL- und Vulkan-Spiele ein flüssiges Rendering erzielen. und das richtige Frame-Tempo auf Android-Geräten.

Die Frame-Taktung ist die Synchronisierung der Logik und Rendering-Schleife eines Spiels mit das Anzeigesubsystem eines Betriebssystems und die zugrunde liegende Anzeigehardware. Das Android-Display wurde entwickelt, um bestimmte visuelle Artefakte wie Reißen zu vermeiden. Die Display-Subsystem vermeidet Tears durch Folgendes:

  • Interne Zwischenspeicherung früherer Frames
  • Späte Frame-Einreichungen erkennen
  • Der aktuelle Frame wird weiterhin angezeigt, wenn ein später Frame erkannt wird.

Uneinheitliche Frame-Anzeigezeiten werden dadurch verursacht, dass die Rendering-Schleife eines Spiels zu folgendem Zeitpunkt läuft: die von der nativen Displayhardware unterstützt wird. Es treten Probleme auf. wenn die Renderingschleife eines Spiels für die zugrunde liegende Displayhardware zu langsam läuft, was zu unterschiedlichen Anzeigezeiten führt. Wenn ein Spiel zum Beispiel Bei einer Bildrate von 30 fps wird versucht, auf einem Gerät zu rendern, das 60 fps sorgt die Rendering-Schleife des Spiels dafür, dass ein wiederholter Frame für einen zusätzlich 16 ms. Diese Art der Trennung führt zu erheblichen Inkonsistenzen bei den Frame Times z. B. 33 ms, 16 ms, 49 ms und so weiter. Übermäßig komplexe Szenen werden zusätzlich zusammengesetzt weil sie dazu führen, dass Frames verpasst werden.

Mit der Frame-Pacing-Bibliothek werden folgende Aufgaben ausgeführt:

  • Gleicht ein Ruckeln aufgrund kurzer Spiel-Frames aus.
  • Verwendet Synchronisierungszäune für lange Frames, die zu Ruckeln und Latenz führen.
    • „Injects“ wartet in der App. Damit kann die Anzeigepipeline anstatt einen Gegendruck aufzubauen.
    • Verwendet Synchronisierungszäune (EGL_KHR_fence_sync und VkFence).
  • Wählt eine Aktualisierungsrate aus, um für Flexibilität und eine reibungslose Präsentation zu sorgen wenn Ihr Gerät mehrere Aktualisierungsraten unterstützt.
  • Stellt Statistiken zum Debugging und zur Profilerstellung mit Frame bereit Statistiken.

Um zu erfahren, wie Sie die Bibliothek so konfigurieren, dass sie in verschiedenen Modi nach finden Sie unter Unterstützte Betriebsmodi.

Informationen zur Implementierung mit dem OpenGL-Renderer oder Vulkan-Renderer findest du unter

Weitere Informationen finden Sie unter Richtige Frame-Taktung erreichen.

Eingriff zur Drosselung der Frames pro Sekunde

Die Frame-per-Second-Drosselung (fps) ermöglicht das Tempo der Spiele mit einem geeigneten FPS nur plattformseitig ohne dass die Entwickler selbst etwas tun müssen.

Die Implementierung der FPS-Drosselung verwendet die folgenden Komponenten:

GameManager-Dienst

Die <ph type="x-smartling-placeholder"></ph> GameManagerService-Komponente verwaltet alle nutzer- und spielspezifische Informationen zum Spielmodus und zur Spielaktion. Die FPS-Informationen werden im GameManagerService mit anderen Eingriffsinformationen wie dem Verkleinerungsfaktor der Auflösung, in einer <PACKAGE_NAME, Interventions>-Zuordnung für jedes Nutzerprofil. Die FPS-Informationen werden aufgerufen, wenn der Spielmodus geändert oder die Aufforderung aktualisiert wird. A UID ist für jede PACKAGE_NAME und jeden Nutzer eindeutig und kann weiter übersetzt werden in ein <UID, Frame Rate>-Paar, das an SurfaceFlinger gesendet wird.

SurfaceFlinger

Die Komponente SurfaceFlinger unterstützt bereits Drosselung der Framerate einer Anwendung, solange die Framerate ein Teil der Aktualisierungsrate des Bildschirms ist. Im Falle eines vsync prüft SurfaceFlinger die Gültigkeit von vsync für den gedrosselten . überprüfen, ob der vsync-Zeitstempel mit der Framerate des . Wenn die Framerate nicht mit vsync übereinstimmt, hält SurfaceFlinger das Bild bis Framerate und vsync in einer Phase sind.

In der folgenden Abbildung wird die Interaktion zwischen GameManagerService und SurfaceFlinger beschrieben:

Interaktion zwischen GameManagerService und SurfaceFlinger

Abbildung 1: Interaktion zwischen GameServiceManager und SurfaceFlinger

SurfaceFinger verwendet eine <UID, Frame Rate>-Paarzuordnung, um eine neue Priorität für die Drosselung der Framerate. UID ist für Nutzer und Spiele eindeutig, sodass jeder Nutzer mit einem Gerät können im selben Spiel unterschiedliche Framerate-Einstellungen festlegen. Zum Drosseln des Framerate eines Spiels zu laden, ruft der GameServiceManager SurfaceFlinger auf, um die Framerate für eine UID. Mit diesem Mechanismus aktualisiert SurfaceFlinger die Karte jedes Mal, wenn wird der Spielmodus geändert oder die Aufforderung aktualisiert. SurfaceFlinger übernimmt die Framerate. indem die Puffer entsprechend eingerastet werden.

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