In Android Vitals ist eine langsame Sitzung eine Sitzung, bei der mehr als 25 % der Frames langsam sind. Ein Frame ist langsam, wenn er nicht weniger als 50 ms nach dem vorherigen Frame dargestellt wird (entspricht 20 fps). Android Vitals meldet auch einen zweiten Messwert für langsame Sitzungen mit einem Ziel von 34 ms (entspricht 30 fps). Durch die Analyse langsamer Sitzungen können Sie die Framerateleistung Ihres Spiels nachvollziehen, die sich darauf auswirkt, wie flüssig und ruckelfrei sich Ihr Spiel für Nutzer anfühlt.
Google Play wird früher oder später dazu übergehen, Nutzern Spiele nicht mehr zu empfehlen, die keine 20 fps auf ihren Smartphones erreichen. Android Vitals beginnt erst eine Minute nach dem Start Ihres Spiels, seine Framerate zu erfassen.
Weitere Informationen zu diesem Messwert finden Sie in der Hilfe.
FPS messen und langsame Frames erkennen
Der Android-Befehl dumpsys SurfaceFlinger --timestats liefert durchschnittliche FPS-Werte und Present-to-Present-Timing-Histogramme für alle gerenderten Ebenen. Die Present-to-Present-Zeit eines Frames ist das Intervall zwischen dem Zeichnen des aktuellen und des vorherigen Frames. So verwenden Sie den Befehl, um die FPS Ihres Spiels zu erfassen:
Führen Sie den Befehl mit den Flags
enableundclearaus, um mit der Erfassung von Informationen zu beginnen:adb shell dumpsys SurfaceFlinger --timestats -clear -enableWenn das Spiel lange genug gespielt wurde, führen Sie den Befehl noch einmal mit dem Flag
dumpaus, um Informationen zu sichern:adb shell dumpsys SurfaceFlinger --timestats -dumpDie ausgegebenen Informationen enthalten die Gesamtzahl der Frames und das
presentToPresent-Histogramm für alle von SurfaceFlinger gerenderten Ebenen. Sie müssen den Abschnitt Ihres Spiels finden, indem Sie nachlayerNamefiltern:layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833Sie können die Rate langsamer Frames der Sitzung anhand der Informationen der einzelnen Ebenen berechnen.
Beispiel: Prozentsatz langsamer Frames bei 20 fps = (Summe der Werte von 54 ms bis 1.000 ms) ÷ totalFrames × 100
totalFrames = 274 ... presentToPresent histogram: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0 66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0Die durchschnittlichen FPS jeder Ebene werden ebenfalls im Dump angezeigt:
... averageFPS = 30.179 ...Nachdem Sie alle Informationen erfasst haben, deaktivieren Sie timestats mit dem Flag
disable:adb shell dumpsys SurfaceFlinger --timestats -disable
Ursachen und Lösungen für langsame Frames
Es gibt viele Gründe, warum ein Frame länger auf dem Bildschirm angezeigt oder gerendert werden kann, als es Ihrem Ziel entspricht. Ihr Spiel ist möglicherweise CPU- oder GPU-gebunden, das Gerät überhitzt und aktiviert einen gedrosselten thermischen Zustand oder es gibt eine Diskrepanz zwischen der Framerate des Spiels und der Aktualisierungsrate des Displays des Geräts.
Verwende Android Frame Pacing (Swappy), Vulkan und ADPF, um diese Probleme zu beheben und die Leistung deines Spiels zu verbessern.
Was ist Swappy?
Die Frame Pacing Library für Android, auch als Swappy bezeichnet, ist Teil der AGDK-Bibliotheken. Swappy hilft OpenGL- und Vulkan-Spielen, ein flüssiges Rendering und eine korrekte Frame-Taktung unter Android zu erreichen.
Frame-Pacing ist die Synchronisierung der Logik und der Rendering-Schleife eines Spiels mit dem Display-Subsystem eines Betriebssystems und der zugrunde liegenden Display-Hardware. Das Android-Anzeigesubsystem wurde so konzipiert, dass visuelle Artefakte (Tearing) vermieden werden, die auftreten können, wenn die Anzeigehardware während eines Updates zu einem neuen Frame wechselt. Um diese Artefakte zu vermeiden, führt das Display-Subsystem Folgendes aus:
- Puffert vergangene Frames intern.
- Erkennt verspätete Frame-Einreichungen.
- Wiederholt die Anzeige früherer Frames, wenn verspätete Frames erkannt werden.
Swappy in nativen Projekten verwenden
In den folgenden Leitfäden erfahren Sie, wie Sie die Android Frame Pacing Library in Ihr Spiel einbinden:
- Android Frame Pacing in den OpenGL-Renderer einbinden
- Android Frame Pacing in den Vulkan-Renderer einbinden
Swappy in der Unity-Game-Engine verwenden
Unity hat Android Frame Pacing in seine Engine integriert. Wenn Sie diese Funktion in Unity 2019.2 oder höher aktivieren möchten, setzen Sie unter Project Settings > Player > Settings (Projekteinstellungen > Player > Einstellungen) für Android > Resolution and Presentation (Android > Auflösung und Präsentation) ein Häkchen bei „Optimized Frame Pacing“:
Alternativ können Sie die Option Optimiertes Frame-Pacing programmatisch in Ihrem Logikcode aktivieren, damit Unity Frames gleichmäßig verteilen kann, um die Varianz der Framerate zu verringern und ein flüssigeres Gameplay zu ermöglichen.
Swappy in der Unreal-Game-Engine verwenden
Unreal 4.25 und höher enthalten die Android Frame Pacing Library, die Teil des Android Game Development Kit ist. Im Artikel Mobile Frame Pacing wird erläutert, wie Sie die Android Frame Pacing Library aktivieren und das Frame Pacing über C++-Code steuern.
Was ist Vulkan?
Vulkan ist eine moderne plattformübergreifende 3D-Grafik-API, die die Abstraktion zwischen der Grafikhardware des Geräts und Ihrem Spiel minimiert. Vulkan ist die primäre Low-Level-Grafik-API für Android und ersetzt OpenGL ES. OpenGL ES wird unter Android weiterhin unterstützt, aber es werden keine neuen Funktionen mehr dafür entwickelt.
Vulkan bietet gegenüber OpenGL ES die folgenden Vorteile:
- Eine effizientere Architektur mit geringerem CPU-Overhead im Grafiktreiber
- Neue Optimierungsstrategien zur Verbesserung der CPU-Leistung
- Neue Grafikfunktionen, die in OpenGL ES nicht verfügbar sind, z. B. bindungslose APIs und Raytracing
Vulkan in nativen Android-Projekten verwenden
Das Codelab Erste Schritte mit Vulkan auf Android-Geräten führt Sie durch die Einrichtung Ihrer Vulkan-Rendering-Pipeline und das Rendern eines texturierten, rotierenden Dreiecks auf dem Bildschirm. Im Codelab erfahren Sie, wie Sie Ihre Spielgrafiken rendern.
Vulkan in der Unity-Spiel-Engine verwenden
Wenn Sie die automatische Geräteauswahl in Unity aktivieren möchten, folgen Sie der Anleitung zum Konfigurieren der Auto Graphics API.
Alternativ können Sie Vulkan manuell aktivieren, indem Sie Auto Graphics API deaktivieren und Vulkan in der Liste Graphics APIs die höchste Priorität zuweisen. Wenn Sie Unity 2021.1 oder eine frühere Version verwenden, ist dies die einzige Möglichkeit, Vulkan zu verwenden.
Mit dem VkQuality Unity-Engine-Plug-in können Sie beim Start Empfehlungen für die Grafik-API für Ihr Spiel auf bestimmten Geräten bereitstellen.
Vulkan in der Unreal-Spiel-Engine verwenden
Wenn Sie die Vulkan-Grafik-API aktivieren möchten, rufen Sie Projekteinstellungen > Plattformen > Android > Build auf und wählen Sie Vulkan unterstützen aus. Wenn Sie sowohl Support Vulkan als auch Support OpenGL ES3.2 auswählen, verwendet Unreal standardmäßig Vulkan. Wenn das Gerät Vulkan nicht unterstützt, greift Unreal auf OpenGL ES 3.2 zurück.
Wenn du bestimmte Vulkan-Funktionen verwendest, die auf bestimmten Geräten bekanntermaßen Probleme verursachen, kannst du deine BaseDeviceProfile.ini-Datei so anpassen, dass diese Geräte ausgeschlossen werden. Informationen zum Anpassen von BaseDeviceProfile.ini finden Sie unter Geräteprofile und Skalierbarkeit für Android anpassen. Da neue Gerätetreiber möglicherweise zuvor bekannte fehlerhafte Geräte korrigieren, sollten Sie Ihre BaseDeviceProfile.ini-Datei auf dem neuesten Stand halten, um alle Optimierungen zu erhalten.
Was ist das ADPF?
Das Android Dynamic Performance Framework (ADPF) optimiert Spiele basierend auf den dynamischen Funktionen zur Temperatur-, CPU- und GPU-Verwaltung unter Android. Der Schwerpunkt liegt auf Spielen, aber Sie können die Funktionen auch für andere leistungsintensive Apps verwenden.
Das ADPF ist eine Reihe von APIs, mit denen Spiele und leistungsintensive Apps direkter mit den Energie- und Thermosystemen von Android-Geräten interagieren können. Mit diesen APIs kannst du das dynamische Verhalten auf Android-Systemen überwachen und die Spieleleistung auf einem nachhaltigen Niveau optimieren, das Geräte nicht überhitzt.
Hier sind die wichtigsten ADPF-Funktionen:
- Thermal API: Überwacht den thermischen Zustand eines Geräts, damit die Anwendung die Arbeitslast proaktiv anpassen kann, bevor sie nicht mehr tragbar ist.
- CPU Performance Hint API: Mit dieser API können Sie Leistungshinweise bereitstellen, damit Android die richtigen Leistungseinstellungen (z. B. CPU-Betriebspunkt oder ‑Kern) für die Arbeitslast auswählen kann.
- Game Mode API und Game State API: Ermöglichen die Optimierung des Gameplays, indem je nach den Einstellungen des Nutzers und den spielspezifischen Konfigurationen die Leistung oder die Akkulaufzeit priorisiert wird.
- Modus mit fester Leistung: Aktivieren Sie den Modus mit fester Leistung auf einem Gerät während des Benchmarkings, um Messwerte zu erhalten, die nicht durch dynamische CPU-Taktung verändert werden.
- Energieeffizienzmodus: Gibt der Sitzung an, dass die Threads in der Sitzung mit Leistungshinweisen so geplant werden können, dass die Energieeffizienz gegenüber der Leistung bevorzugt wird. Verfügbar in Android 15 (API-Level 35).
ADPF in nativen Android-Projekten verwenden
Im Codelab Integrating Adaptability Features Into Your Native Game (Anpassungsfunktionen in Ihr natives Spiel einbinden) erfahren Sie, wie Sie ADPF-Funktionen in Ihr Spiel einbinden. Sie können die Schritte in Ihrem eigenen Tempo ausführen. Am Ende des Codelabs haben Sie die folgenden Funktionen integriert:
- Thermal API: Mit dieser API kannst du den thermischen Zustand des Geräts überwachen und reagieren, bevor das Gerät in den thermischen Drosselungszustand wechselt.
- Game Mode API: Hier kannst du die Optimierungseinstellungen der Spieler (Leistung maximieren oder Akku schonen) einsehen und entsprechend anpassen.
- Game State API: Informiert das System über den Status des Spiels (Laden, Spielen, UI usw.), damit das System die Ressourcen entsprechend anpassen kann (E/A, CPU, GPU usw. erhöhen).
- Performance Hint API: Informieren Sie das System über Ihr Threading-Modell und Ihre Arbeitslast, damit das System die Ressourcen entsprechend zuweisen kann.
ADPF in der Unity-Game-Engine verwenden
Adaptive Performance von Unity ist ein Tool für Spieleentwickler, die ihre Spiele für Mobilgeräte optimieren möchten, insbesondere für das vielfältige Android-Ökosystem. Mit Adaptive Performance kann sich Ihr Spiel in Echtzeit an die Leistung und die thermischen Eigenschaften des Geräts anpassen, um ein reibungsloses und effizientes Spielerlebnis zu ermöglichen.
Adaptive Performance Android Provider führt Sie durch die Schritte zur Implementierung von ADPF in Unity. Weitere Informationen findest du unter ADPF Unity Adaptive Performance und Android-Anbieter.
ADPF in der Unreal-Game-Engine verwenden
- Laden Sie das Plug-in herunter.
- Kopieren Sie das Plug-in in den Plug-in-Ordner des Projekts.
- Aktiviere das ADPF-Unreal Engine-Plug-in im Unreal-Editor.
- Starten Sie den Unreal-Editor neu.
- Erstellen und kochen Sie das Spiel.
Das Android Dynamic Performance Framework-Plug-in (ADPF) für die Unreal Engine sorgt für eine stabile Leistung und verhindert thermische Drosselung. Laden Sie das Plug-in von GitHub herunter. Dieses Plug-in ändert Funktionen, indem Unreal-Konsolenwerte festgelegt werden. Weitere Informationen findest du unter ADPF Unreal Engine-Plug-in.