Langsame Sitzungen

Eine langsame Sitzung ist eine Sitzung, bei der mehr als 25% der Frames langsam sind. Ein Frame ist langsam, wenn er nicht innerhalb von 50 ms nach dem vorherigen Frame präsentiert wird (entspricht 20 fps). Android Vitals meldet auch einen zweiten Messwert für langsame Sitzungen mit einem Zielwert 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. Hinweis: Android Vitals beginnt erst eine Minute nach dem Start Ihres Spiels, die Framerate zu erfassen.

Weitere Informationen zur Messung

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 die durchschnittliche FPS und das Present-to-Present-Timing-Histogramm für alle gerenderten Ebenen. Die present to present-Zeit eines Frames ist das Intervall zwischen dem Zeichnen des aktuellen Frames und des vorherigen Frames. So verwendest du den Befehl, um die FPS deines 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 auszugeben:

    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
    

    Die langsame Framerate der Sitzung kann anhand der Informationen der einzelnen Ebenen berechnet werden.

    Beispiel: Prozentsatz langsamer Frames bei 20 fps = (Summe der Werte von 54 ms bis 1.000 ms) / totalFrames × 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    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 durchschnittliche FPS jeder Ebene wird ebenfalls im Dump angezeigt:

    ...
    averageFPS = 30.179
    ...
    
  3. Nachdem Sie alle Informationen erfasst haben, sollten Sie die Zeitstatistiken mit dem Flag disable deaktivieren:

    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 vom Entwickler vorgesehen. Das Spiel könnte CPU-/GPU-gebunden sein. Oder das Gerät überhitzt und aktiviert einen gedrosselten thermischen Zustand. Oder die Framerate des Spiels und die Aktualisierungsrate des Displays des Geräts stimmen nicht überein.

Verwende Android Frame Pacing (Swappy), Vulkan und ADPF, um diese Probleme zu beheben und die Leistung deines Spiels zu verbessern.

Was ist Swappy?

Die Android-Frame Pacing-Bibliothek, auch bekannt als Swappy, ist Teil der AGDK-Bibliotheken. Swappy sorgt dafür, dass OpenGL- und Vulkan-Spiele auf Android reibungslos gerendert werden und die Framerate korrekt ist.

Frame Pacing ist die Synchronisierung der Logik und des Rendering-Loops eines Spiels mit dem Display-Subsystem eines Betriebssystems und der zugrunde liegenden Display-Hardware. Das Android-Anzeigesubsystem wurde so konzipiert, dass visuelle Artefakte (sogenanntes Tearing) vermieden werden, die auftreten können, wenn die Displayhardware während eines Updates zu einem neuen Frame wechselt. Um diese Artefakte zu vermeiden, führt das Display-Subsystem Folgendes aus:

  • Pufferung vergangener Frames intern
  • Erkennt verspätete Frame-Einreichungen
  • Wiederholt die Anzeige vergangener Frames, wenn verspätete Frames erkannt werden

So hat Mir 2 mit Swappy die Rate langsamer Sitzungen von 40% auf 10%gesenkt.

Swappy in nativen Projekten verwenden

In den folgenden Leitfäden erfahren Sie, wie Sie die Android Frame Pacing-Bibliothek 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 ein Häkchen bei „Optimized Frame Pacing“ (Optimierte Frame-Abfolge) unter Project Settings > Player > Settings (Projekteinstellungen > Player > Einstellungen) für Android > Resolution and Presentation (Android > Auflösung und Darstellung):

Dialogfeld „Projekteinstellungen“
Abbildung 2. Aktivieren Sie „Frame Pacing“ in der Unity-Engine.

Alternativ können Sie die Option für optimierte Frame-Pacing in Ihrem Logikcode programmatisch aktivieren, damit Unity die Frames gleichmäßig verteilt. So wird die Framerate weniger schwanken und das Gameplay flüssiger.

Swappy in der Unreal-Engine verwenden

In Unreal 4.25 und höher ist die Android Frame Pacing Library integriert, die Teil des Android Game Development Kit ist. Im Artikel Mobile Frame Pacing wird beschrieben, 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 darauf ausgelegt ist, die Abstraktion zwischen der Grafikhardware des Geräts und Ihrem Spiel zu minimieren. Vulkan ist die primäre Low-Level-Grafik-API auf Android und ersetzt OpenGL ES. OpenGL ES wird auf Android weiterhin unterstützt, aber nicht mehr aktiv weiterentwickelt.

Vulkan bietet gegenüber OpenGL ES folgende Vorteile:

  • Eine effizientere Architektur mit geringerem CPU-Aufwand im Grafiktreiber
  • Neue Optimierungsstrategien zur Verbesserung der CPU-Leistung
  • Neue Grafikfunktionen, die in OpenGL ES nicht verfügbar sind, z. B. bindless APIs und Raytracing

Vulkan in nativen Android-Projekten verwenden

Im Codelab Erste Schritte mit Vulkan unter Android erfahren Sie, wie Sie Ihre Vulkan-Rendering-Pipeline einrichten und dann ein strukturiertes, rotierendes Dreieck auf dem Bildschirm rendern. Mit dem Codelab können Sie lernen, 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.

Dialogfeld „Projekteinstellungen“
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 auf die höchste Priorität setzen. Wenn Sie Unity 2021.1 oder eine frühere Version verwenden, ist dies die einzige Möglichkeit, Vulkan zu verwenden.

Dialogfeld „Projekteinstellungen“
Abbildung 4: Wählen Sie Vulkan manuell als primäre Grafik-API in Unity aus.

Mit dem VkQuality-Unity-Engine-Plug-in können Sie Empfehlungen für die Grafiken-API bereitstellen, die Ihr Spiel auf bestimmten Geräten verwenden soll.

Vulkan in der Unreal 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 Vulkan unterstützen als auch OpenGL ES3.2 unterstützen auswählen, verwendet Unreal standardmäßig Vulkan. Wenn das Gerät Vulkan nicht unterstützt, greift Unreal auf OpenGL ES 3.2 zurück.

Dialogfeld „Projekteinstellungen“
Abbildung 5. Aktivieren Sie Vulkan in der Unreal Engine.

Wenn Sie bestimmte Vulkan-Funktionen verwenden, die auf bestimmten Geräten bekanntermaßen schlecht funktionieren, können Sie die Datei BaseDeviceProfile.ini anpassen, um diese Geräte auszuschließen. Informationen zum Anpassen von Geräteprofilen und zur Skalierbarkeit für AndroidBaseDeviceProfile.ini Da neue Gerätetreiber möglicherweise zuvor bekannte fehlerhafte Geräte korrigieren, sollten Sie die Datei BaseDeviceProfile.ini immer auf dem neuesten Stand halten, um alle Optimierungen zu erhalten.

Was ist ADPF?

Das Android Dynamic Performance Framework (ADPF) optimiert Spiele basierend auf den dynamischen Funktionen für die Verwaltung von Wärme, CPU und GPU unter Android. Der Fokus liegt auf Spielen, aber Sie können die Funktionen auch für andere leistungsintensive Apps verwenden.

ADPF ist eine Reihe von APIs, mit denen Spiele und leistungsintensive Apps direkter mit den Energie- und Kühlsystemen von Android-Geräten interagieren können. Mit diesen APIs können Sie das dynamische Verhalten von Android-Systemen überwachen und die Spieleleistung auf einem nachhaltigen Niveau optimieren, ohne dass Geräte überhitzen.

Hier sind die wichtigsten ADPF-Funktionen:

  • Thermal API: Mit dieser API können Sie den thermischen Zustand eines Geräts überwachen, damit die Anwendung die Arbeitslast proaktiv anpassen kann, bevor sie nicht mehr tragbar wird.
  • CPU Performance Hint API: Mit Leistungshinweisen kann Android die richtigen Leistungseinstellungen (z. B. CPU-Betriebspunkt oder ‑Kern) für die Arbeitslast auswählen.
  • Game Mode API und Game State API: Ermöglichen die Optimierung des Spiels durch Priorisierung von Leistungs- oder Akkulaufzeitmerkmalen basierend auf den Einstellungen des Nutzers und spieleigenen Konfigurationen.
  • Modus mit fester Leistung: Aktivieren Sie den Modus mit fester Leistung auf einem Gerät während des Benchmarking, um Messungen zu erhalten, die nicht durch dynamisches CPU-Taktung verändert werden.
  • Energiesparmodus: Gibt an, dass die Threads in der Performance-Hinweis-Sitzung sicher so geplant werden können, dass die Energieeffizienz Vorrang vor der Leistung hat. 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 durchgehen. Am Ende des Codelabs haben Sie die folgenden Funktionen eingebunden:

  • Thermal API: Sie können den thermischen Zustand des Geräts überwachen und reagieren, bevor das Gerät in den Zustand der thermischen Drosselung wechselt.
  • Game Mode API: Die API gibt Aufschluss über die Optimierungseinstellungen der Spieler (maximale Leistung oder Akkuschonung).
  • Game State API: Informieren Sie das System über den Status Ihres Spiels (Laden, Spielen, Benutzeroberfläche usw.), damit das System die Ressourcen entsprechend anpassen kann (I/O, CPU, GPU usw. optimieren).
  • Performance Hint API: Informieren Sie das System über Ihr Threading-Modell und Ihre Arbeitslast, damit es Ressourcen entsprechend zuweisen kann.

ADPF in der Unity-Game-Engine verwenden

Adaptive Performance von Unity ist ein Tool für Spieleentwickler, die ihre Spiele auf Mobilgeräten optimieren möchten, insbesondere für das vielfältige Android-Ökosystem. Mit Adaptive Performance kann sich dein Spiel in Echtzeit an die Leistungs- und thermischen Eigenschaften des Geräts anpassen. So wird ein reibungsloses und effizientes Spielerlebnis ermöglicht.

Die Adaptive Performance Android-Anbieter führen Sie durch die Schritte zur Implementierung von ADPF in Unity.

Dialogfeld „Projekteinstellungen“
Abbildung 6: ADPF in die Unity-Engine einbinden

ADPF in der Unreal-Spiel-Engine verwenden

Dialogfeld „Projekteinstellungen“
Abbildung 7. ADPF in Unreal Engine einbinden
  1. Plug-in herunterladen
  2. Kopieren Sie das Plug-in in den Plug-in-Ordner des Projekts.
  3. ADPF Unreal Engine-Plug-in im Unreal-Editor aktivieren
  4. Unreal Editor neu starten
  5. Spiel erstellen und „kochen“

Das Android Dynamic Performance Framework-Plugin(ADPF) für die Unreal Engine sorgt für eine stabile Leistung und verhindert eine thermische Drosselung. Laden Sie das Plugin von GitHub herunter. Dieses Plugin ändert Funktionen durch Festlegen von Unreal-Konsolenwerten.