Android Performance Tuner (nativ)

In diesem Artikel wird beschrieben, wie Sie den Android Performance Tuner (auch bekannt als Abstimmung Fork-Bibliothek) integrieren, um Frame-Time-Daten aus nativen Spiel-Engines (C und C++) aufzuzeichnen und hochzuladen.

Weitere Informationen zur Unity-Spiele-Engine findest du im Leitfaden für Unity.

Hintergrund

Eine wichtige Komponente des Spielerlebnisses ist die Renderingleistung. Die Rendering-Leistung ist ein Ergebnis der folgenden beiden Eingaben:

  • Framerate: Die Häufigkeit, mit der ein Frame gezeichnet wird.
  • Einstellungen für die grafische Qualität: Die Grafikqualität, mit der ein Frame dargestellt wird, einschließlich der Simulationsqualität sowie der Grafik.

Für Spiele wird eine gute Rendering-Leistung so definiert:

  • Sie sorgen für eine stabile, konsistente Framerate (d. h. den Prozentsatz der Frames, die mit der gewünschten Frequenz gerendert werden).
  • Frames mit der höchstmöglichen Frequenz unter Aufrechterhaltung der Stabilität rendern, normalerweise je nach Art des Spiels 30 oder 60 fps.
  • Maximieren des Detailgrads für einen Nutzer angesichts seiner Bildschirmgröße und -dichte unter Einhaltung einer gewünschten, stabilen Framerate.

Die Android Frame Pacing-Bibliothek schränkt einen Großteil der Varianz der Framezeiten ein und bietet so eine stabile Framerate für Spiele. Die verbleibende Variante der Framezeiten ist auf den Detaillierungsgrad, der während bestimmter Spielszenen angezeigt wird, und die grafischen Fähigkeiten des Geräts zurückzuführen. Mit dem Android Performance Tuner kannst du Zeiten während des Spiels bestimmen, zu denen die Frame Time langsamer oder schneller als dein Ziel ist, und diese Probleme und Optimierungsmöglichkeiten in Beziehung setzen:

  • Spezifische Qualitätseinstellungen
  • Bestimmte Szenen in deinem Spiel
  • Bestimmte Gerätemodelle oder technische Daten

Daten aufzeichnen und hochladen

Die Abstimmung Fork-Bibliothek stützt sich darauf, dass eine ihrer Tick-Funktionen von der Android Frame Pacing-Bibliothek jeden Frame aufgerufen wird. Innerhalb der Bibliothek werden diese Tick-Informationen in Histogrammen zusammengefasst, die dann regelmäßig über einen HTTP-Endpunkt bei Google Play hochgeladen werden. Jeder Tick wird als mit einem Instrumentenschlüssel und einer Annotation verknüpft aufgezeichnet, also den Definitionen, die Sie in einer Protokollpufferdatei angeben.

Instrumentenschlüssel

Ein Instrumentenschlüssel gibt an, woher der Tick im Frame stammt. Er ist eine Ganzzahl, die an jeden Tick-Funktionsaufruf übergeben werden muss. Die Android Frame Pacing-Bibliothek verwendet einen vordefinierten Satz von Instrumentenschlüsseln, der in swappy_common.h definiert ist. Wenn Sie die Frame Pacing-Bibliothek nicht verwenden, können Sie auch eigene Instrumentenschlüssel definieren.

Anmerkungen

Anmerkungen liefern Kontextinformationen zu den Aktionen Ihres Spiels, wenn ein Tick aufgezeichnet wird. Eine Annotation könnte beispielsweise folgende Elemente identifizieren:

  • Das aktuelle Level in einem Spiel
  • Ein „großer Chef“ auf dem Bildschirm
  • Sonstige relevante Informationen zum Spielstatus

Annotationen werden durch die Protokollpuffernachricht com.google.tuningfork.Annotation definiert. Um die aktuelle Annotation festzulegen, übergeben Sie eine Serialisierung der Nachricht, die Sie an TuningFork_setCurrentAnnotation() definiert haben. Alle nachfolgenden Tickdaten werden dann dieser Annotation zugeordnet, bis eine andere Annotation festgelegt wird. Im Folgenden finden Sie ein Beispiel für eine Proto-Definition für Annotationen:

import "tuningfork.proto"
enum Level {
  INVALID_LEVEL = 0;
  Level_1 = 1;
  Level_2 = 2;
  Level_3 = 3;
}
message Annotation {
  optional Level level = 1;
}

Parameter zur Grafikqualität

Parameter zur Grafikqualität beeinflussen die Leistung und Grafikqualität Ihres Spiels, z. B. den Detaillierungsgrad des Mesh-Netzwerks, die Texturauflösung und die Anti-Aliasing-Methode. Wie Anmerkungen werden Parameter zur Grafikqualität über die Protokollpuffernachricht com.google.tuningfork.FidelityParams definiert. Im Folgenden finden Sie ein Beispiel für eine Proto-Definition für Fidelity-Parameter:

import "tuningfork.proto"
message FidelityParams {
  int32 texture_quality_level = 1;
  int32 shadow_resolution = 2;
  float terrain_details_percent = 3;
  int32 post_processing_effects_level = 4;
}

Bei der Initialisierung von Abstimmung Fork übergeben Sie eine Serialisierung der Parameter, die das Spiel verwendet. Sie können diese Parameter ändern, wenn der Nutzer beispielsweise die Rendering-Einstellungen des Spiels ändert und Ihre anschließend hochgeladenen Daten mit den neuen Parametern verknüpft werden.

Damit Google Play die von Ihnen definierten Anmerkungen und Parameter zur Grafikqualität versteht, muss die Protokollpufferdatei mit diesen Definitionen zusammen mit den Initialisierungseinstellungen im APK des Spiels gebündelt werden. Außerdem müssen Sie Standardwerte für häufig verwendete Kombinationen von Parametern zur Grafikqualität in Ihrem APK angeben, damit Ihre Daten in der Google Play-Benutzeroberfläche danach segmentiert werden. Weitere Informationen finden Sie unter Qualitätsstufen definieren.

Arbeitsspeicher und CPU-Overhead

Der gesamte von der Abstimmung Fork-Bibliothek verwendete Speicher wird bei der Initialisierung zugewiesen, um Überraschungen während des Spiels zu vermeiden. Die Größe der Daten hängt von der Anzahl der Instrumentenschlüssel, der Anzahl der möglichen Annotationen und der Anzahl der Buckets im jeweiligen Histogramm ab. Sie ist ein Vielfaches davon multipliziert mit 4 Byte für jeden Bucket. Außerdem sind zwei Kopien aller Histogramme vorhanden, um die Einreichung in doppelt gepufferter Form zu ermöglichen.

Die Übertragung erfolgt in einem separaten Thread und blockiert keine Tick-Aufrufe. Wenn keine Uploadverbindung verfügbar ist, wird die Einreichung für den späteren Upload in die Warteschlange gestellt.

Der Verarbeitungsaufwand für das Aufrufen einer Tickfunktion ist gering: Sie berechnet einfach einen Index in das Array von Histogramm-Buckets und erhöht die Zahl der Ganzzahlen.

„Abstimmung Fork“-Bibliothek einbinden

Diese Integrationsanleitung ist in zwei Teile gegliedert. Im ersten Teil wird beschrieben, wie du einen End-to-End-Test mit einer Demo-App und der Google Play Console durchführst. Im zweiten Teil wird beschrieben, wie Sie die „Abstimmung Fork“-Bibliothek in Ihre Toolchain einbinden und die von der Bibliothek bereitgestellten Funktionen verwenden. Klicken Sie unten auf den Link Weiter, um zu beginnen.