Vitesse de défilement

FPS moyen

Une fréquence d'images fluide et stable est essentielle pour offrir une expérience de jeu de haute qualité sur les appareils Android. Lorsque vous mesurez les performances d'un jeu, vous devez mesurer le FPS moyen comme référence pour obtenir une compréhension de base de l'expérience. Vous devez optimiser votre jeu pour atteindre une fréquence d'images moyenne de 60 FPS afin de garantir une expérience de jeu optimale.

FPS P90 et P99 pour la stabilité

Même avec une moyenne fluide de 60 FPS, un jeu peut toujours subir des problèmes intermittents, des micro-saccades et un décalage d'entrée imprévisible, ce qui nuit à l'expérience du joueur.

La stabilité des images est donc tout aussi essentielle que le suivi de la fréquence d'images moyenne. C'est là que vous devez mesurer les métriques de fréquence d'images P90 et P99 comme référence cohérente et indicateur de saccades, respectivement. Ces métriques capturent la "fin" des performances pour vous permettre d'optimiser la fluidité de l'expérience du joueur.

Métriques

  • FPS moyen (référence) : cette métrique fondamentale fournit une référence générale des performances de votre jeu. Bien qu'il s'agisse d'un benchmark standard, le calcul moyen signifie que les baisses de fréquence d'images intermittentes et les micro-saccades ne peuvent pas être détectées, ce qui rend cette métrique insuffisante pour représenter l'expérience du joueur à elle seule.
  • FPS P90 (référence cohérente au 10e centile) : cela indique que 90 % de vos images ont dépassé cette référence cohérente et que seuls les 10 % d'images les plus lentes ont mis plus de temps à s'afficher. Si votre fréquence d'images P90 est élevée et proche de votre moyenne, le jeu fonctionne de manière cohérente pour la grande majorité de la session.
  • FPS P99 (indicateur de saccades au 1er centile) : cela indique que 99 % de vos images ont dépassé cet indicateur de saccades, isolant spécifiquement les 1 % d'images les plus lentes. Cette métrique est essentielle pour détecter les micro-saccades, les retards de chargement des assets et les pics soudains de rendu d'assets lourds qui provoquent des problèmes visibles.

Exemples

En comparant votre FPS moyen aux métriques P90 et P99, vous pouvez diagnostiquer avec précision le comportement sous-jacent d'un jeu.

Scénario 1 : courbe optimale (jeu optimisé)

  • Moyenne : 60 FPS (16,6 ms)
  • P90: 58 FPS (17,2 ms)
  • P99: 52 FPS (19,2 ms)
  • Analyse : les métriques sont étroitement regroupées. Le jeu est incroyablement fluide et cohérent. Il n'y a pas de micro-saccades, et même les 1% d'images les plus lentes sont à peine perceptibles à l'œil nu.

Scénario 2 : goulot d'étranglement de la charge (lié au processeur/GPU)

  • Moyenne : 45 FPS (22,2 ms)
  • P90: 40 FPS (25,0 ms)
  • P99: 38 FPS (26,3 ms)
  • Analyse : la fréquence d'images moyenne est inférieure, mais de manière cohérente. Le P99 ne baisse pas de manière drastique par rapport à la moyenne. Cela indique que le système est essentiellement submergé par les paramètres graphiques ou les contraintes de résolution. Le jeu ne semble pas saccader, mais plutôt lent. La réduction des paramètres graphiques permet généralement d'augmenter ces métriques de manière uniforme.

Scénario 3 : 60 FPS instables (compilation de nuanceurs / saccades de streaming d'éléments) )

  • Moyenne : 60 FPS (16,6 ms)
  • P90: 45 FPS (22,2 ms)
  • P99: 15 FPS (66,6 ms)
  • Analyse : il s'agit du pire scénario. Bien que la fréquence d'images moyenne semble excellente, le P99 révèle un problème critique. Un P99 de 66,6 ms signifie que le jeu se fige complètement pendant plusieurs images à la fois. Cela indique des valeurs aberrantes importantes, généralement causées par des goulots d'étranglement du processeur, des retards de streaming d'assets (par exemple, une RAM ou un stockage lents) ou des problèmes causés par la compilation de shaders.

Mesure

Pour mesurer efficacement le FPS moyen, le P90 et le P99, vous pouvez utiliser la commande Android dumpsys surfaceflinger timestats. Cet outil fournit le FPS moyen et un histogramme de timing presentToPresent pour toutes les couches en cours de rendu. Le temps presentToPresent d'une image correspond à l'intervalle entre l'image actuelle et l'image précédente en cours de dessin.

Voici les instructions détaillées pour collecter et calculer ces métriques pour votre jeu :

  1. Commencer la capture : exécutez la commande suivante avec les indicateurs enable et clear pour commencer à capturer des informations :

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Vider les informations : lorsque le jeu a été joué suffisamment longtemps, exécutez à nouveau la commande avec l'indicateur dump pour générer les informations :

    adb shell dumpsys SurfaceFlinger --timestats -dump
    
  3. Filtrer par couche : les informations vidées fournissent des données pour toutes les couches affichées par SurfaceFlinger. Vous devez trouver la section correspondant à votre jeu en filtrant en fonction de layerName (par exemple, layerName = SurfaceView[com.example.yourgame...]).

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    
  4. Identifier le FPS moyen : le FPS moyen de chaque couche est calculé automatiquement et s'affiche directement dans la sortie de vidage (par exemple, averageFPS = 30.179).

    ...
    averageFPS = 30.179
    ...
    
  5. Calculer le FPS P90 et P99 : pour trouver les métriques P90 et P99, vous devez analyser le totalFrames et l'histogramme de timing presentToPresent fournis dans le vidage.

    totalFrames = 1000
    ...
    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=850 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=100 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0
    66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 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
    

    A. Exemple conceptuel (tableau de distribution cumulée) Supposons que votre session de jeu ait enregistré un nombre totalFrames de 1 000. Pour trouver le P90 et le P99, vous calculez les seuils en millisecondes où le nombre d'images cumulé atteint respectivement 900 images (90%) et 990 images (99%), en comptant à partir du bucket de millisecondes le plus bas.

    Temps de rendu (ms) Nombre d'images (histogramme) Nombre d'images cumulé État / Calcul du centile
    16ms 850 850 85,0%
    33ms 100 950 95,0%
    (Objectif P90 de 900 atteint ! → 1 000/33 = 30,3 FPS)
    50ms 35 985 98,5%
    66ms 10 995 99,5%
    (Objectif P99 de 990 atteint ! → 1 000/66 = 15,1 FPS)
    102ms 5 1 000 100%

    B. Logique d'implémentation (pseudocode) Si vous automatisez cette analyse à l'aide d'un script Python ou d'un analyseur de journaux, la logique d'extraction des valeurs P90 et P99 de l'histogramme peut être implémentée comme suit :

    # Define target thresholds based on total frame count
    p90_target = totalFrames * 0.90
    p99_target = totalFrames * 0.99
    
    cumulative_frames = 0
    p90_fps = None
    p99_fps = None
    
    # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond)
    for ms_bucket, frame_count in present_to_present_histogram:
        cumulative_frames += frame_count
    
        # Capture P90 when cumulative frames cross the 90% threshold
        if p90_fps is None and cumulative_frames >= p90_target:
            p90_fps = 1000 / ms_bucket
    
        # Capture P99 when cumulative frames cross the 99% threshold
        if p99_fps is None and cumulative_frames >= p99_target:
            p99_fps = 1000 / ms_bucket
            break # Optimization: stop iterating once both targets are found
    
  6. Arrêter la capture : après avoir collecté toutes les informations nécessaires, vous devez désactiver les statistiques de temps à l'aide de l'indicateur disable :

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Sessions lentes

Les sessions lentes identifient les problèmes de performances généralisés dans le monde réel. Une session est "lente" si plus de 25% des images passent en dessous d'un seuil (par exemple, 20 FPS). Bien qu'utile pour détecter les problèmes critiques de compilation, cette métrique seule ne peut pas garantir une expérience durable de haute qualité. Un jeu peut éviter le seuil de session lente, mais toujours souffrir de micro-saccades qui compromettent une expérience fluide à 60 FPS.

Bien qu'elles soient toutes deux dérivées des temps de rendu, les métriques "Session lente" et "Fréquence d'images" ont des rôles différents. Les métriques FPS moyen, P90 et P99 mesurent la qualité et la durabilité des performances, en détectant les baisses instantanées et le rythme incohérent que la métrique Session lente peut ignorer.

Conclusion

Une optimisation réussie des performances nécessite une stratégie complète. Les développeurs doivent utiliser les sessions lentes comme radar principal pour détecter une dégradation importante des performances, puis examiner le FPS moyen, le P90 et le P99 pour diagnostiquer les causes sous-jacentes et vérifier la fluidité réelle du gameplay. En intégrant ces métriques, vous pouvez vous assurer que votre application offre une expérience utilisateur durable et exceptionnelle.

Ressources supplémentaires

Pour en savoir plus sur les techniques de profilage avancées, l'implémentation de l'API Frame Pacing et les stratégies d'optimisation spécifiques au moteur, consultez la documentation officielle pour les développeurs Android :

  • Android Vitals : sessions lentes : découvrez comment Google Play mesure et signale les périodes prolongées d'affichage lent, qui ont un impact direct sur l'expérience utilisateur. Une "session lente" est définie comme une session utilisateur dans laquelle plus de 25% des images sont lentes (par exemple, plus de 50 ms, ce qui équivaut à 20 FPS).
  • Développeurs Android : optimiser les performances des jeux : explorez le hub central pour l'optimisation des jeux Android. Ce guide complet couvre les bonnes pratiques et les outils de profilage (tels qu'AGI et Perfetto) pour vous aider à optimiser les performances globales de votre jeu.