Présentation d'Android Performance Tuner (natif)

Cet article explique comment intégrer Android Performance Tuner (également connu sous le nom de bibliothèque Tuning Fork) pour enregistrer et importer des données de temps de rendu à partir de moteurs de jeux natifs (C et C++).

.

Pour le moteur de jeu Unity, consultez le guide Unity.

Arrière-plan

Les performances de rendu constituent un élément clé de toute expérience de jeu. Elles dépendent de deux facteurs :

  • La fréquence de frames : fréquence à laquelle chaque frame apparaît.
  • Les paramètres de qualité graphique : le niveau de fidélité auquel un frame apparaît, y compris la fidélité de simulation et des éléments graphiques.

Pour les jeux, voici comment sont définies les performances de rendu :

  • Fréquence de frames stable et cohérente (c'est-à-dire un pourcentage de frames dont le rendu s'effectue à la fréquence souhaitée).
  • Rendu des frames à la fréquence la plus élevée possible tout en préservant la stabilité (généralement 30 ou 60 FPS, selon le type de jeu).
  • Maximisation du niveau de détail pour chaque utilisateur en fonction de la taille et de la densité de son écran, tout en respectant une fréquence de frames stable et suffisante

La bibliothèque Android Frame Pacing limite les variations des temps de rendu, offrant ainsi une fréquence de frames stable pour les jeux. Certaines variations du temps de rendu subsistent en raison du niveau de détail de certaines scènes du jeu et des fonctionnalités graphiques de l'appareil. Grâce à Android Performance Tuner, vous pouvez identifier les moments où le temps de rendu dans le jeu est plus lent ou plus rapide que souhaité, et mettre en corrélation ces problèmes et ces marges d'amélioration avec :

  • des paramètres de qualité spécifiques ;
  • des scènes spécifiques de votre jeu ;
  • des modèles ou caractéristiques techniques spécifiques d'appareils.

Enregistrer et importer des données

La bibliothèque Tuning Fork s'appuie sur l'appel à chaque image de l'une de ses fonctions de tick par la bibliothèque Android Frame Pacing. Dans la bibliothèque, ces informations de tick sont agrégées sous forme d'histogrammes, qui sont ensuite régulièrement importés sur Google Play via un point de terminaison HTTP. Chaque tick est enregistré comme étant associée à une clé d'instrumentation et à une annotation dont vous devez spécifier les définitions dans un fichier de tampon de protocole.

Clés d'instrumentation

Une clé d'instrumentation indique l'emplacement dans le rendu d'affichage dont provient le tick. C'est un nombre entier qui doit être transmis dans chaque appel de la fonction de tick. La bibliothèque Android Frame Pacing utilise un ensemble prédéfini de clés d'instrumentation, définies dans swappy_common.h. Vous pouvez également définir vos propres clés d'instrumentation si vous n'utilisez pas la bibliothèque Frame Pacing.

Annotations

Les annotations fournissent des informations contextuelles sur le comportement de votre jeu lorsqu'un tick est enregistré. Par exemple, une annotation peut identifier l'un des éléments suivants :

  • Niveau actuel du jeu
  • Un "big boss" apparaît à l'écran
  • Toute autre information pertinente sur l'état du jeu

Les annotations sont définies par le message de tampon de protocole com.google.tuningfork.Annotation. Pour définir l'annotation actuelle, vous transmettez une sérialisation du message que vous avez défini à TuningFork_setCurrentAnnotation(). Toutes les données de tick suivantes sont ensuite associées à cette annotation jusqu'à ce qu'une nouvelle annotation soit définie. Voici un exemple de définition du protocole pour les annotations :

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

Paramètres de fidélité

Les paramètres de fidélité influencent les performances et la fidélité graphique de votre jeu, dont le niveau de détail au niveau de chaque mesh, la résolution de la texture et la méthode d'anticrénelage. Tout comme les annotations, les paramètres de fidélité sont définis à l'aide du message de tampon de protocole com.google.tuningfork.FidelityParams. Voici un exemple de protodéfinition pour les paramètres de fidélité :

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;
}

Lors de l'initialisation de Tuning Fork, vous transmettez une sérialisation des paramètres utilisés par le jeu. Vous pouvez modifier ces paramètres si, par exemple, l'utilisateur modifie les paramètres de rendu du jeu et si les données que vous importez par la suite sont associées aux nouveaux paramètres.

Pour que Google Play comprenne les annotations et les paramètres de fidélité que vous définissez, le fichier de tampon de protocole contenant ces définitions doit être ajouté dans l'APK du jeu, avec ses paramètres d'initialisation. Vous devez également fournir des valeurs par défaut pour les combinaisons courantes de paramètres de fidélité de votre APK afin que leur segmentation soit effectuée dans l'UI Google Play. Pour en savoir plus, consultez la section Définir des niveaux de qualité.

Ressources nécessaires en mémoire et en processeur

Toute la mémoire utilisée par la bibliothèque Tuning Fork est allouée lors de l'initialisation afin d'éviter les mauvaises surprises en plein jeu. La taille des données dépend du nombre de clés d'instrumentation, du nombre d'annotations possibles et du nombre de buckets dans chaque histogramme. C'est un multiple de tous ces éléments multipliés par quatre octets pour chaque bucket. Il existe également deux copies de tous les histogrammes pour l'envoi avec une mise en mémoire tampon double.

L'envoi a lieu sur un thread distinct et ne bloque pas les appels de la fonction tick. Si aucune connexion d'importation n'est disponible, l'envoi est mis en file d'attente pour une importation ultérieure.

L'appel d'une fonction de tick nécessite peu de ressources, car il calcule simplement un index dans le tableau de buckets d'histogramme et l'incrémente d'un nombre entier.

Intégrer la bibliothèque Tuning Fork

Ce guide d'intégration est divisé en deux parties. La première explique comment exécuter un test de bout en bout à l'aide d'une application de démonstration et de la Google Play Console. La deuxième partie explique comment intégrer la bibliothèque Tuning Fork à votre chaîne d'outils et comment utiliser les fonctions fournies par la bibliothèque. Cliquez sur le lien Suivant ci-dessous pour commencer.