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 nombre moyen de FPS comme référence pour obtenir une compréhension de base de l'expérience. Vous devez optimiser votre jeu pour qu'il atteigne une fréquence d'images moyenne de 60 FPS afin d'offrir une expérience de jeu optimale.

FPS P90 et P99 pour la stabilité

Même avec une moyenne de 60 FPS, un jeu peut encore subir des saccades intermittentes, 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 cruciale 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 en tant que référence cohérente et indicateur de saccades, respectivement. Ces métriques capturent la "fin de queue" 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 de la moyenne signifie que les baisses de fréquence d'images intermittentes et les micro-saccades ne peuvent pas être détectées, ce qui le rend insuffisant pour représenter l'expérience du joueur à lui seul.
  • FPS P90 (référence cohérente au 10e centile) : cela signifie que 90 % de vos images ont dépassé cette référence cohérente et que seules 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, cela signifie que le jeu fonctionne de manière stable pour la grande majorité de la session.
  • FPS P99 (indicateur de saccade au 1er centile) : indique que 99 % de vos frames ont dépassé cet indicateur de saccade, en isolant spécifiquement les 1 % de frames les plus lentes. Cette métrique est essentielle pour détecter les micro-saccades, les retards de chargement des éléments et les pics soudains de rendu d'éléments lourds qui provoquent des saccades visibles.

Exemples

En comparant votre fréquence d'images moyenne aux métriques P90 et P99, vous pouvez diagnostiquer précisément 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 le pire 1% des images est à peine perceptible à 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 plus faible, mais de manière constante. Le P99 ne chute pas de manière spectaculaire 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 semblera pas saccadé, mais plutôt lent. Diminuer les paramètres graphiques entraîne généralement une augmentation uniforme de ces métriques.

Scénario 3 : 60 FPS instables (compilation de nuanceurs / bégaiements 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 des scénarios. Alors 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 frames à la fois. Cela indique des valeurs aberrantes importantes, généralement dues à des goulots d'étranglement du processeur, à des retards de streaming des éléments (par exemple, une RAM ou un espace de stockage lents) ou à des saccades causées par la compilation des nuanceurs.

Mesure

Pour mesurer efficacement la fréquence d'images moyenne, P90 et P99, vous pouvez utiliser la commande Android dumpsys surfaceflinger timestats. Cet outil fournit le nombre moyen de FPS et un histogramme de timing presentToPresent pour tous les calques en cours de rendu. Le temps presentToPresent d'un frame correspond à l'intervalle entre le frame actuel et le frame précédent 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" (activer) et "clear" (effacer) pour commencer à capturer des informations :

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Informations sur le vidage : lorsque vous avez joué suffisamment longtemps, exécutez à nouveau la commande avec l'indicateur de vidage pour afficher les informations :

    adb shell dumpsys SurfaceFlinger --timestats -dump
    
  3. Filtrer par calque : les informations extraites fournissent des données pour tous les calques affichés 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 la fréquence d'images moyenne : la fréquence d'images moyenne pour chaque calque est calculée automatiquement et s'affiche directement dans la sortie du dump (par exemple, averageFPS = 30.179).

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

    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 cumulative)�: supposons que votre session de jeu ait enregistré un nombre total de frames de 1 000. Pour trouver P90 et P99, vous devez calculer les seuils en millisecondes où le nombre cumulé d'images atteint respectivement 900 images (90%) et 990 images (99%), en comptant à partir du bucket de millisecondes le plus bas.

    Délai d'affichage (ms) Nombre de frames (histogramme) Nombre cumulé de frames État / Calcul du centile
    16 ms 850 850 85%
    33 ms 100 950 95,0%
    (Objectif P90 de 900 atteint ! → 1 000/33 = 30,3 FPS)
    50 ms 35 985 98,5%
    66 ms 10 995 99,5%
    (Objectif P99 de 990 atteint ! → 1 000/66 = 15,1 FPS)
    102 ms 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 timestats à l'aide du flag de désactivation :

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Sessions lentes

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

Bien que les deux soient dérivés des durées de frame, "Session lente" et "Fréquence d'images" ont des rôles différents. Les métriques de fréquence d'images moyenne, P90 et P99 mesurent la qualité et la durabilité des performances. Elles détectent les baisses instantanées et le rythme irrégulier que la métrique "Session lente" peut ne pas détecter.

Conclusion

Pour optimiser efficacement vos performances, vous devez adopter une stratégie globale. Les développeurs doivent utiliser les sessions lentes comme radar principal pour détecter les graves dégradations des performances, puis examiner la moyenne des FPS, ainsi que les valeurs P90 et 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 une session utilisateur au cours de laquelle plus de 25% des images sont lentes (par exemple, plus de 50 ms, ce qui équivaut à 20 FPS).
  • Android Developers : optimiser les performances des jeux : découvrez le hub central pour l'optimisation des jeux Android. Ce guide complet couvre les bonnes pratiques et les outils de profilage (comme Android Performance Analyzer(APA) et Perfetto) pour vous aider à maximiser les performances globales de votre jeu.