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.
- Fügt Präsentationszeitstempel hinzu, damit die Frames pünktlich und nicht pünktlich angezeigt werden frühzeitig ändern.
- Die Zeitstempelerweiterungen für Präsentationen
EGL_ANDROID_presentation_time
undVK_GOOGLE_display_timing
werden verwendet.
- 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
undVkFence
).
- 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
- Android Frame Pacing in den OpenGL-Renderer einbinden
- Android Frame Pacing in den Vulkan-Renderer einbinden
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](https://source.android.com/static/docs/core/graphics/images/fps-throttling-flow.png?authuser=6&hl=de)
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