Langsame Sitzungen (nur Spiele)

Eine langsame Spielsitzung ist eine Sitzung, in der ein erheblicher Teil der Frames (z. B. mehr als 25% der Frames) die Ziel-Framezeit nicht erreicht, z. B. 50 ms pro Frame (entspricht 20 fps) oder 34 ms pro Frame (entspricht 30 fps). Die Framerateleistung zu überwachen und zu optimieren ist entscheidend, da sich ausgelassene oder verzögerte Frames direkt darauf auswirken, wie flüssig und reaktionsschnell sich Ihr Spiel für die Spieler anfühlt.

Unter Android werden die Frameraten von Sitzungen anhand von Daten aus SurfaceFlinger gemessen. Dabei wird das Zeitintervall zwischen den Frames berücksichtigt, die auf Oberflächen des Spiels gezeichnet werden (einschließlich OpenGL-, Vulkan- und Android-UI-Toolkit-Oberflächen). Wenn Ihre App das View-basierte UI Toolkit verwendet, bei dem der für den Nutzer sichtbare Teil der App aus Canvas oder der View-Hierarchie gerendert wird, lesen Sie den Abschnitt Langsames Rendern.

FPS messen und langsame Frames erkennen

Der Android-Befehl dumpsys surfaceflinger timestats liefert ein Histogramm mit der durchschnittlichen FPS und dem Present-to-Present-Timing 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 Histogramm „presentToPresent“ 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 Anzahl der FPS für jede 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.

Mit Android Frame Pacing (Swappy), Vulkan und ADPF kannst du diese Probleme beheben und die Leistung deines Spiels 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 Anzeigesubsystem eines Betriebssystems und der zugrunde liegenden Anzeigehardware. Das Android-Display-Subsystem wurde so konzipiert, dass visuelle Artefakte (sogenanntes Tearing) vermieden werden, die auftreten können, wenn die Display-Hardware 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 vergangener Frames, wenn verspätete Frames erkannt werden

Weitere Informationen dazu, wie Mir 2 mit Swappy die Rate langsamer Sitzungen von 40% auf 10%senken konnte

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-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-Abstimmung) unter Project Settings > Player > Settings (Projekteinstellungen > Player > Einstellungen) für Android > Resolution and Presentation (Android > Auflösung und Darstellung):

Dialogfeld „Projekteinstellungen“
Abbildung 1: 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-Overhead 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

Das Codelab Erste Schritte mit Vulkan unter Android führt Sie durch die Einrichtung Ihrer Vulkan-Rendering-Pipeline und das Rendern eines strukturierten, rotierenden Dreiecks auf dem Bildschirm. In diesem Codelab erfahren Sie, wie Sie die Grafiken Ihres Spiels 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 2. 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 (Grafik-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 nutzen.

Dialogfeld „Projekteinstellungen“.
Abbildung 3: Wählen Sie Vulkan in Unity manuell als primäre Grafik-API 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, wird standardmäßig Vulkan verwendet. Wenn das Gerät Vulkan nicht unterstützt, greift Unreal auf OpenGL ES 3.2 zurück.

Dialogfeld „Projekteinstellungen“.
Abbildung 4: 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 Ihre BaseDeviceProfile.ini-Datei anpassen, um diese Geräte auszuschließen. Informationen zum AnpassenBaseDeviceProfile.ini von Geräteprofilen und zur Skalierbarkeit für Android 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, die es Spielen und leistungsintensiven Apps ermöglichen, direkter mit den Energie- und Kühlsystemen von Android-Geräten zu interagieren. Mit diesen APIs können Sie das dynamische Verhalten von Android-Systemen überwachen und die Spieleleistung auf einem nachhaltigen Niveau optimieren, sodass Geräte nicht ü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 aufrechterhalten werden kann.
  • CPU Performance Hint API: Geben Sie Leistungshinweise an, 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 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. Die Schritte können Sie in Ihrem eigenen Tempo durchführen. Am Ende des Codelabs haben Sie die folgenden Funktionen integriert:

  • 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.

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

Dialogfeld „Projekteinstellungen“
Abbildung 5. ADPF in die Unity-Engine einbinden

ADPF in der Unreal-Spiel-Engine verwenden

Dialogfeld „Projekteinstellungen“
Abbildung 6: ADPF in Unreal Engine einbinden
  1. Plug-in herunterladen
  2. Kopieren Sie das Plug-in in den Projekt-Plug-in-Ordner.
  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-Plug-in(ADPF) für die Unreal Engine sorgt für eine stabile Leistung und verhindert thermisches Drosseln. Laden Sie das Plug-in von GitHub herunter. Dieses Plug-in ändert Funktionen, indem Unreal-Konsolenwerte festgelegt werden.