Langsame Sitzungen

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.

Kreisdiagrammähnliche Grafiken, die die Anzahl der langsamen und nicht langsamen Frames zeigen.
Abbildung 1: Eine langsame Sitzung in Android Vitals.

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:

  1. Führen Sie den Befehl mit den Flags enable und clear aus, um mit der Erfassung von Informationen zu beginnen:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Wenn das Spiel lange genug gespielt wurde, führen Sie den Befehl noch einmal mit dem Flag dump aus, um Informationen zu sichern:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    Die 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 nach layerName filtern:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    Sie 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=0
    

    Die durchschnittlichen FPS jeder Ebene werden ebenfalls im Dump angezeigt:

    ...
    averageFPS = 30.179
    ...
    
  3. 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.

Hier erfährst du, wie Mir 2 mit Swappy den Anteil langsamer Sitzungen von 40 % auf 10 % reduzieren konnte.

Swappy in nativen Projekten verwenden

In den folgenden Leitfäden erfahren Sie, wie Sie die Android Frame Pacing Library in Ihr Spiel 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“:

Fenster „Unity Projekteinstellungen“ mit dem Kästchen „Optimized Frame Pacing“.
Abbildung 2. Frame-Pacing in der Unity-Engine aktivieren.

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.

Fenster „Project Settings“ (Projekteinstellungen) in Unity mit aktivierter Auto Graphics API.
Abbildung 3. Aktivieren Sie die Unity 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.

Fenster „Project Settings“ (Projekteinstellungen) in Unity, in dem Vulkan in der Liste der Grafik-APIs priorisiert ist.
Abbildung 4. Wählen Sie Vulkan in Unity manuell als Hauptgrafik-API aus.

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.

Fenster „Project Settings“ (Projekteinstellungen) in Unreal Engine mit der Option „Support Vulkan“ (Vulkan unterstützen).
Abbildung 5. Vulkan in Unreal Engine aktivieren

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.

Fenster mit den Unity-Projekteinstellungen, in dem die Einstellungen für den Android-Anbieter für Adaptive Performance angezeigt werden.
Abbildung 6: ADPF in die Unity Engine einbinden

ADPF in der Unreal-Game-Engine verwenden

Unreal Engine-Plug-in-Fenster mit dem Android Dynamic Performance Framework-Plug-in.
Abbildung 7. ADPF in Unreal Engine einbinden
  1. Laden Sie das Plug-in herunter.
  2. Kopieren Sie das Plug-in in den Plug-in-Ordner des Projekts.
  3. Aktiviere das ADPF-Unreal Engine-Plug-in im Unreal-Editor.
  4. Starten Sie den Unreal-Editor neu.
  5. 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.