Frequenza fotogrammi

FPS medio

Una frequenza fotogrammi fluida e stabile è fondamentale per offrire un'esperienza di gioco di alta qualità sui dispositivi Android. Quando misuri il rendimento del gioco, devi misurare gli FPS medi come riferimento per avere una comprensione di base dell'esperienza. Per garantire un'esperienza di gioco ottimale, devi ottimizzare il tuo gioco in modo che raggiunga una frequenza fotogrammi media di 60 FPS.

FPS P90 e P99 per la stabilità

Con una media fluida di 60 FPS, un gioco può comunque subire interruzioni intermittenti, micro-scatti e ritardi di input imprevedibili, con conseguente esperienza di gioco scadente.

Pertanto, la stabilità dei fotogrammi è importante tanto quanto il monitoraggio della frequenza fotogrammi media. È qui che devi misurare le metriche della frequenza fotogrammi P90 e P99 come rispettivamente baseline coerente e indicatore di stuttering. Queste metriche acquisiscono la "coda" del rendimento per consentirti di ottimizzare la fluidità dell'esperienza del giocatore.

Metriche

  • FPS medio (baseline): questa metrica fondamentale fornisce una baseline generale delle prestazioni del tuo gioco. Sebbene sia un benchmark standard, il calcolo della media significa che non è possibile rilevare cali di frame intermittenti e micro-scatti, il che lo rende insufficiente a rappresentare l'esperienza del giocatore da solo.
  • FPS P90 (baseline coerente al 10° percentile): indica che il 90% dei frame ha superato questa baseline coerente e solo il 10% dei frame più lenti ha impiegato più tempo per il rendering. Se la frequenza fotogrammi P90 è elevata e vicina alla media, il gioco funziona in modo costante per la stragrande maggioranza della sessione.
  • FPS P99 (indicatore di scatti al percentile 1%): indica che il 99% dei frame ha superato questo indicatore di scatti, isolando in modo specifico l'1% dei frame più lenti. Questa metrica è essenziale per rilevare micro-scatti, ritardi nel caricamento degli asset e picchi improvvisi di rendering con molti asset che causano interruzioni visibili.

Esempi

Confrontando gli FPS medi con le metriche P90 e P99, puoi diagnosticare con precisione il comportamento sottostante di un gioco.

Scenario 1: una curva ottimale (gioco ottimizzato)

  • Media: 60 FPS (16,6 ms)
  • P90: 58 FPS (17,2 ms)
  • P99: 52 FPS (19,2 ms)
  • Analisi: le metriche sono raggruppate in modo compatto. Il gioco è incredibilmente fluido e costante. Non ci sono micro-scatti e anche l'1% peggiore dei fotogrammi è appena percettibile all'occhio umano.

Scenario 2: collo di bottiglia del carico (vincolato a CPU/GPU)

  • Media: 45 FPS (22,2 ms)
  • P90: 40 FPS (25 ms)
  • P99: 38 FPS (26,3 ms)
  • Analisi: la frequenza fotogrammi media è inferiore, ma in modo costante. Il P99 non diminuisce drasticamente rispetto alla media. Ciò indica che il sistema è essenzialmente sovraccarico a causa delle impostazioni grafiche o dei vincoli di risoluzione. Il gioco non sembrerà balbettare, ma piuttosto lento. La riduzione delle impostazioni grafiche in genere aumenta in modo uniforme queste metriche.

Scenario 3: 60 FPS instabili (compilazione degli shader / streaming degli asset con interruzioni)

  • Media: 60 FPS (16,6 ms)
  • P90: 45 FPS (22,2 ms)
  • P99: 15 FPS (66,6 ms)
  • Analisi: questo è lo scenario peggiore. Sebbene la frequenza dei fotogrammi media sembra eccellente, il P99 rivela un problema critico. P99 a 66,6 ms significa che il gioco si blocca completamente per più frame alla volta. Questo indica valori anomali gravi, di solito causati da colli di bottiglia della CPU, ritardi nello streaming degli asset (ad esempio RAM o spazio di archiviazione lenti) o problemi causati dalla compilazione degli shader.

Misurazione

Per misurare in modo efficace FPS medio, P90 e P99, puoi utilizzare il comando timestats dumpsys surfaceflinger di Android. Questo strumento fornisce l'FPS medio e un istogramma di temporizzazione presentToPresent per tutti i livelli in fase di rendering. Il tempo presentToPresent di un frame è l'intervallo tra il frame corrente e il frame precedente che viene disegnato.

Ecco le istruzioni passo passo per raccogliere e calcolare queste metriche per il tuo gioco:

  1. Avvia la registrazione: esegui il comando seguente con i flag enable e clear per avviare l'acquisizione delle informazioni:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. Informazioni sul dump: quando il gioco è stato giocato abbastanza a lungo, esegui di nuovo il comando con il flag di dump per visualizzare l'output delle informazioni:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    
  3. Filtra per livello: le informazioni di dump forniscono dati per tutti i livelli visualizzati da SurfaceFlinger. Devi trovare la sezione corrispondente al tuo gioco filtrando in base a layerName (ad esempio, layerName = SurfaceView[com.example.yourgame...]).

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    
  4. Identifica la media di FPS: la media di FPS per ogni livello viene calcolata automaticamente e viene mostrata direttamente nell'output del dump (ad esempio, averageFPS = 30.179).

    ...
    averageFPS = 30.179
    ...
    
  5. Calcola FPS P90 e P99: per trovare le metriche P90 e P99, devi analizzare totalFrames e l'istogramma di temporizzazione presentToPresent fornito nel 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. Esempio concettuale (tabella di distribuzione cumulativa) Supponiamo che la sessione di gioco abbia registrato un conteggio totalFrames di 1000. Per trovare P90 e P99, calcola le soglie in millisecondi in cui il conteggio cumulativo dei frame raggiunge rispettivamente 900 frame (90%) e 990 frame (99%), contando a partire dal bucket in millisecondi più basso.

    Durata frame (ms) Conteggio frame (istogramma) Conteggio frame cumulativo Stato / calcolo del percentile
    16ms 850 850 85,0%
    33ms 100 950 95,0%
    (Obiettivo P90 di 900 raggiunto. → 1000/33 = 30,3 FPS)
    50ms 35 985 98,5%
    66ms 10 995 99,5%
    (P99 Target of 990 Reached! → 1000/66 = 15,1 FPS)
    102ms 5 1000 100%

    B. Logica di implementazione (pseudocodice) Se automatizzi questa analisi utilizzando uno script Python o un parser dei log, la logica per estrarre i valori P90 e P99 dall'istogramma può essere implementata nel seguente modo:

    # 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. Interrompi l'acquisizione: dopo aver raccolto tutte le informazioni necessarie, devi disattivare le statistiche temporali utilizzando il flag di disattivazione:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

Sessioni lente

Sessioni lente identifica problemi di rendimento diffusi nel mondo reale. Una sessione è "lenta" se oltre il 25% dei frame scende al di sotto di una soglia (ad esempio, 20 FPS). Sebbene sia utile per individuare problemi di build critici, questa metrica da sola non può garantire un'esperienza sostenibile e di alta qualità. Un gioco potrebbe evitare la soglia di sessione lenta, ma comunque soffrire di micro-scatti che compromettono un'esperienza fluida a 60 FPS.

Sebbene entrambi derivino dai tempi dei frame, "Sessione lenta" e "Frequenza fotogrammi" svolgono ruoli diversi. Le metriche FPS medio, P90 e P99 misurano la qualità e la sostenibilità delle prestazioni, rilevando cali istantanei e un ritmo incoerente che la metrica Sessione lenta potrebbe trascurare.

Conclusione

L'ottimizzazione del rendimento riuscita richiede una strategia completa. Gli sviluppatori devono utilizzare le sessioni lente come radar principale per rilevare un grave calo delle prestazioni, quindi esaminare FPS medio, P90 e P99 per diagnosticare le cause sottostanti e verificare l'effettiva fluidità del gameplay. Integrando queste metriche, puoi assicurarti che la tua applicazione offra un'esperienza utente costantemente sostenibile ed eccezionale.

Risorse aggiuntive

Per scoprire di più sulle tecniche di profilazione avanzate, sull'implementazione dell'API Frame Pacing e sulle strategie di ottimizzazione specifiche per i motori, consulta la documentazione ufficiale per gli sviluppatori Android:

  • Android vitals: sessioni lente: scopri in che modo Google Play misura e segnala i periodi prolungati di rendering lento, che influiscono direttamente sull'esperienza utente. Una "sessione lenta" è definita come una sessione utente in cui oltre il 25% dei frame è lento (ad esempio, impiega più di 50 ms, equivalenti a 20 FPS).
  • Android Developers: Optimize Game Performance: esplora l'hub centrale per l'ottimizzazione dei giochi per Android. Questa guida completa illustra le best practice e gli strumenti di profilazione (come Android Performance Analyzer(APA) e Perfetto) per aiutarti a massimizzare le prestazioni complessive del tuo gioco.