Frame-Pacing

Die Android Frame Pacing-Bibliothek, auch bekannt als Swappy, ist Teil des Android Game SDK . Es hilft OpenGL- und Vulkan -Spielen, ein reibungsloses Rendering und ein korrektes Frame-Pacing auf Android zu erreichen.

Frame Pacing ist die Synchronisierung der Logik und der Rendering-Schleife eines Spiels mit dem Anzeigesubsystem eines Betriebssystems und der zugrunde liegenden Anzeigehardware. 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
  • Erkennung verspäteter Frame-Übermittlungen
  • Zeigt weiterhin das aktuelle Bild an, wenn ein verspätetes Bild erkannt wird

Inkonsistente Bildanzeigezeiten 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, bewirkt die Renderschleife des Spiels, dass ein wiederholter Frame für zusätzliche 16 ms auf dem Bildschirm verbleibt. Diese Art der Trennung führt zu erheblichen Inkonsistenzen bei den Rahmenzeiten, z. B. 33 ms, 16 ms, 49 ms usw. Übermäßig komplexe Szenen verschärfen dieses Problem weiter, da sie dazu führen, dass Frames ausgelassen werden.

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

  • Kompensiert Ruckeln aufgrund kurzer Spielframes.
  • Verwendet Sync-Zäune für lange Frames, die zu Stottern und Latenz führen.
    • Injiziert Wartezeiten in die App. Diese ermöglichen es der Display-Pipeline, aufzuholen, anstatt zuzulassen, dass sich Gegendruck aufbaut.
    • Verwendet Sync-Fences ( EGL_KHR_fence_sync und VkFence ).
  • Wählt eine Aktualisierungsrate, um Flexibilität und eine reibungslose Präsentation zu bieten, wenn Ihr Gerät mehrere Aktualisierungsraten unterstützt.
  • Stellt Statistiken zum Debuggen und Profiling 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 mit OpenGL-Renderer oder Vulkan-Renderer finden Sie unter

Weitere Informationen finden Sie unter Richtiges Frame-Pacing erreichen .

Frames pro Sekunde (FPS) Throttling Intervention

FPS-Drosselungsintervention ermöglicht es Spielen, mit einem angemessenen FPS-Tempo zu laufen, indem nur plattformseitige Änderungen verwendet werden und ohne dass ein Eingreifen der Entwickler erforderlich ist.

Die Implementierung des FPS-Drosselungseingriffs verwendet die folgenden Komponenten:

GameManagerService

Die GameManagerService -Komponente verwaltet alle benutzer- und spielbezogenen Informationen zum Spielmodus und zur Spielintervention. Die FPS-Informationen werden im GameManagerService zusammen mit anderen Interventionsinformationen, wie z. B. dem Herunterskalierungsfaktor der Auflösung, in einer <PACKAGE_NAME, Interventions> für jedes Benutzerprofil gespeichert. Auf die FPS-Informationen wird zugegriffen, wenn der Spielmodus geändert oder die Intervention aktualisiert wird. Eine UID ist für jeden PACKAGE_NAME und jeden 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 das Drosseln der FPS einer Anwendung, solange die Bildrate ein Teiler der Anzeigeaktualisierungsrate ist. Im Falle eines vsync überprüft der SurfaceFlinger die Gültigkeit des vsync für die gedrosselte Anwendung, indem er überprüft, ob der vsync-Zeitstempel mit der Framerate der Anwendung phasengleich ist. Wenn die Framerate nicht mit Vsync phasengleich ist, hält der SurfaceFlinger den Frame, bis Framerate und Vsync phasengleich sind.

Die folgende Abbildung beschreibt das Zusammenspiel 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 Drosselung der Bildrate festzulegen. Die UID ist zwischen Benutzern und Spielen eindeutig, sodass jeder Benutzer auf einem einzelnen Gerät unterschiedliche Einstellungen der Bildrate 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 der SurfaceFlinger das Mapping immer dann, wenn der Spielmodus geändert oder die Intervention aktualisiert wird. Der SurfaceFlinger handhabt die FPS-Änderung, indem er die Puffer entsprechend speichert.

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