Langsame Sitzungen (nur Spiele)

„Langsame Sitzungen“ ist ein neuer Android Vitals-Messwert in der Google Play Console. Eine langsame Sitzung ist 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 angezeigt wird (entspricht 20 fps). Außerdem meldet Android Vitals einen zweiten Messwert für langsame Sitzungen mit einem Ziel von 34 ms (entspricht 30 fps). Mithilfe von langsamen Sitzungen können Sie die Framerate-Leistung Ihres Spiels nachvollziehen, die sich darauf auswirkt, wie flüssig und flüssig sich Ihr Spiel für Nutzer anfühlt.

Google Play wird demnächst damit beginnen, Nutzer von Spielen abzuhalten, die auf ihren Smartphones keine 20 fps erreichen können. Beachte, dass Android Vitals die Framerate erst dann überwacht, wenn dein Spiel eine Minute lang gelaufen ist.

Weitere Informationen zu diesem Messwert finden Sie in unserer Hilfe.

Kreisdiagrammenä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 stellt für alle Ebenen, die gerendert werden, die durchschnittlichen fps bereit und präsentiert ein Timing-Histogramm. Die Zeit bis zur Gegenwart eines Frames (Present to vorhanden) ist das Intervall zwischen dem aktuellen und dem vorherigen Frame, der gezeichnet wird. Mit den folgenden Schritten können Sie den Befehl zum Erfassen des fps Ihres Spiels verwenden:

  1. Führen Sie den Befehl mit den Flags enable und clear aus, um mit dem Erfassen 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 Dump-Informationen enthalten die Gesamtzahl der Frames und das PresentToPresent-Histogramm für alle Ebenen, die von SurfaceFlinger gerendert wurden. 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 x 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
    

    Im Dump wird auch die durchschnittliche fps jeder Ebene angezeigt:

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

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Gründe für langsame Frames und Lösungen

Es gibt viele Gründe, warum ein Frame auf dem Bildschirm länger angezeigt oder gerendert werden kann, als vom Entwickler vorgegeben. Das Spiel könnte CPU/GPU-gebunden sein. Oder das Gerät überhitzt und aktiviert einen gedrosselten Temperaturzustand. Oder es liegt eine Diskrepanz zwischen der Framerate des Spiels und der Aktualisierungsrate des Displays des Geräts vor.

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 als Swappy bezeichnet, ist Teil der AGDK-Bibliotheken. Mit Swappy können OpenGL- und Vulkan-Spiele unter Android ein reibungsloses Rendering und eine korrekte Frame-Taktung erreichen.

Die Frame-Taktung ist die Synchronisierung der Logik und Rendering-Schleife eines Spiels mit dem Anzeigesubsystem eines Betriebssystems und der zugrunde liegenden Anzeigehardware. Das Display-Subsystem von Android wurde entwickelt, um visuelle Artefakte (Trennung) zu vermeiden, die auftreten können, wenn die Display-Hardware nach einem Update zu einem neuen Frame wechselt. Um diese Artefakte zu vermeiden, geht das Anzeigesubsystem so vor:

  • Führt Frames intern zwischen
  • Erkennt späte Frame-Einreichungen
  • Wiederholt die Anzeige vergangener Frames, wenn späte Frames erkannt werden

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-Spiel-Engine verwenden

Unity hat Android Frame Pacing in seine Engine integriert. Um diese Funktion ab Unity 2019.2 zu aktivieren, klicken Sie unter Project Settings > Player > Settings (Projekteinstellungen > Player > Einstellungen) für Android > Resolution and Presentation das Kästchen für die optimierte Frame-Taktung an:

Dialogfeld „Projekteinstellungen“.
Abbildung 2: Frame-Pacing in Unity Engine aktivieren

Alternativ können Sie in Ihrem Logikcode programmatisch die Option „Optimierte Frame-Pacing“ aktivieren, damit Unity Frames gleichmäßig verteilt, um die Framerate zu reduzieren. So entsteht ein flüssigeres Gameplay.

So verwendest du Swappy in der Unreal-Spiel-Engine

In Unreal 4.25 und höher ist die Android Frame Pacing Library eingebunden, die Teil des Android Game Development Kit ist. Im Artikel Frame Pacing für Mobilgeräte wird erläutert, wie Sie die Android Frame Pacing Library aktivieren und die Frame-Taktung über C++ Code steuern.

Was ist Vulkan

Vulkan ist eine moderne, plattformübergreifende API für 3D-Grafiken, die entwickelt wurde, um die Abstraktion zwischen der Grafikhardware des Geräts und Ihrem Spiel zu minimieren. Vulkan ist die primäre Low-Level-Grafik-API unter Android und ersetzt OpenGL ES. OpenGL ES wird unter Android weiterhin unterstützt, befindet sich jedoch nicht mehr in der aktiven Entwicklung von Funktionen.

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 Ray Tracing

Vulkan in nativen Android-Projekten verwenden

Im Codelab zu Erste Schritte mit Vulkan auf Android erfahren Sie, wie Sie Ihre Vulkan-Rendering-Pipeline einrichten und anschließend ein texturiertes, rotierendes Dreieck auf dem Bildschirm rendern. Im Codelab erfährst du, wie du die Grafik deines Spiels renderst.

Vulkan in der Unity-Spiel-Engine verwenden

Wenn Sie die automatische Geräteauswahl auf Unity aktivieren möchten, folgen Sie den Schritten zur Konfiguration der Auto Graphics API.

Dialogfeld „Projekteinstellungen“.
Abbildung 3: Unity Auto Graphics API aktivieren

Alternativ können Sie Vulkan auch manuell aktivieren. Deaktivieren Sie dazu die Auto Graphics API und setzen Sie Vulkan in der Liste der Graphics APIs auf die höchste Priorität. Wenn du Unity 2021.1 oder eine frühere Version verwendest, kannst du Vulkan nur so nutzen.

Dialogfeld „Projekteinstellungen“.
Abbildung 4: Wähle Vulkan in Unity manuell als Hauptgrafik-API aus.

Verwende das VkQuality Unity-Engine-Plug-in, um Empfehlungen zum Startzeitpunkt der Grafik-API für dein Spiel bereitzustellen, die du auf bestimmten Geräten verwenden möchtest.

Vulkan in der Unreal-Spiel-Engine verwenden

Gehen Sie zum Aktivieren der Vulkan Graphic API zu Projekteinstellungen > Plattformen > Android > Erstellen und wählen Sie Vulkan unterstützen aus. Wenn du sowohl Vulkan unterstützen als auch Unterstützung von OpenGL ES3.2 auswählst, 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. Vulkan in Unreal Engine aktivieren.

Wenn du bestimmte Vulkan-Elemente verwendest, die auf bestimmten Geräten bekanntermaßen ein schlechtes Verhalten haben, 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 reparieren, sollten Sie die Datei BaseDeviceProfile.ini 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 Thermal-, CPU- und GPU-Verwaltungsfunktionen von Android. Der Schwerpunkt liegt auf Spielen, aber Sie können die Funktionen auch für andere leistungsintensive Anwendungen verwenden.

ADPF besteht aus einer Reihe von APIs, über die Spiele und leistungsintensive Apps direkter mit Strom- und Heizsystemen von Android-Geräten interagieren können. Mit diesen APIs können Sie das dynamische Verhalten von Android-Systemen überwachen und die Spielleistung auf einem nachhaltigen Niveau optimieren, das Geräte nicht überhitzt.

Dies sind die wichtigsten ADPF-Funktionen:

  • Thermal API: Überwachen Sie den Überhitzungszustand eines Geräts, damit die Anwendung die Arbeitslast proaktiv anpassen kann, bevor sie unhaltbar wird.
  • CPU Performance Hint API: Geben Sie Leistungshinweise, damit Android die richtigen Leistungseinstellungen für die Arbeitslast auswählen kann (z. B. CPU-Betriebspunkt oder Kern).
  • Game Mode API und Game State API: Ermöglichen Sie die Spieloptimierung, indem die Leistung oder Akkulaufzeit basierend auf den Einstellungen des Nutzers und spielspezifischen Konfigurationen priorisiert werden.
  • Modus mit fester Leistung: Aktivieren Sie auf einem Gerät während des Benchmarkings den Modus mit fester Leistung, um Messungen zu erhalten, die durch dynamisches CPU-Takting nicht verändert werden.
  • Energiesparmodus: Teilt der Sitzung mit, dass die Threads in der Leistungs-Hinweissitzung sicher geplant werden können, um Energieeffizienz gegenüber Leistung zu bevorzugen. Verfügbar in Android 15 (API-Version 35).

ADPF in nativen Android-Projekten verwenden

Im Codelab zum Integrieren von ADPF-Funktionen in Ihr Spiel mit Schritten, die Sie in Ihrem eigenen Tempo ausführen können, wird das Codelab Integration von Anpassungsfunktionen in Ihr natives Spiel erläutert. Am Ende des Codelabs werden Sie die folgenden Funktionen integriert haben:

  • Thermal API: Hören Sie auf den Wärmezustand des Geräts und reagieren Sie, bevor das Gerät in den thermischen Drosselungszustand übergeht.
  • Game Mode API: Verstehen Sie die Optimierungseinstellungen der Spieler (Leistung maximieren oder Akku schonen), und nehmen Sie entsprechende Anpassungen vor.
  • Game State API: Teilen Sie dem System den Status Ihres Spiels (z. B. Laden, Spielen oder UI) mit, damit das System die Ressourcen entsprechend anpassen kann (Boost-E/A, CPU, GPU usw.).
  • Performance Hint API: Teilen Sie dem System Ihr Threading-Modell und Ihre Arbeitslast mit, damit das System die Ressourcen entsprechend zuweisen kann.

ADPF in der Unity-Spiel-Engine verwenden

Unity's Adaptive Performance ist ein Tool für Spieleentwickler, die ihre Spiele auf Mobilgeräten insbesondere für das vielfältige Android-Ökosystem optimieren möchten. Mit der Funktion „Adaptive Performance“ kann sich dein Spiel in Echtzeit an die Leistung und Temperatureigenschaften des Geräts anpassen und so für ein reibungsloses und effizientes Spielerlebnis sorgen.

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

Dialogfeld „Projekteinstellungen“.
Abbildung 6. Binden Sie ADPF in die Unity Engine ein.

ADPF in der Unreal-Game-Engine verwenden

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

Das Plug-in Android Dynamic Performance Framework(ADPF) für die Unreal Engine bietet eine stabile Leistung und verhindert thermische Drosselung. Laden Sie das Plug-in von GitHub herunter. Bei diesem Plug-in werden Unrealistische Konsolenwerte festgelegt, um die Funktionen zu ändern.