Quick answer: Average frame time hides bad frames. P99 and P99.9 tell you what your worst-perceived experience looks like. Instrument both and target the percentile, not the average.

A game with 60fps average and 250ms P99.9 stutters every few seconds. Players feel it; the average doesn't show it.

Collect every frame time

Log frame deltas to an in-memory ring buffer. Don't sample; collect the full distribution.

Compute percentiles per minute

P50, P95, P99, P99.9 every minute. Send to telemetry. Stable averages with growing P99.9 = degrading worst case.

Target P99, not average

Set a 16.67ms (60fps) target on P99. Trying to optimize average is satisfying; the players who quit are reacting to P99.

Visualize with histograms

Heatmap of frame times across a play session shows hitches as bright lines. Pattern recognition beats numbers.

“Players don't perceive averages. They perceive the bad frames.”

If you can only ship one perf metric to your dashboard, ship P99.9 of frame time. Everything else follows from there.