Performance and Benchmarking
Frame pacing lab: when 62.5 FPS tells two different stories
Two synthetic traces with the same average. An executable script shows exactly what the average and p95 hide.
Research question
Can identical average FPS hide materially different frame intervals?
Hypothesis
A trace with a handful of 54 ms intervals can match the throughput of a stable 16 ms trace.
Method
Generate two 100-interval traces and calculate throughput, nearest-rank p95 and p99, and counts above the 60 fps frame budget.
Results
Both traces yield 62.5 fps. The even trace has p99 of 16 ms. The uneven trace has p99 of 54 ms and five intervals beyond the 60 fps budget.
Limitations
The traces are synthetic and make no claim about a console or a shipping game. The aggregates do not show where the long frames occur.
Run the calculation
from math import ceil
def percentile(samples, p):
values = sorted(samples)
return values[ceil(len(values) * p / 100) - 1]
def describe(samples):
return {
"fps": round(1000 * len(samples) / sum(samples), 2),
"p95_ms": percentile(samples, 95),
"p99_ms": percentile(samples, 99),
"over_60fps_budget": sum(ms > 1000 / 60 for ms in samples),
}
print("even", describe([16] * 100))
print("uneven", describe([14] * 95 + [54] * 5))Compare the tail
| Trace | Average FPS | p95 ms | p99 ms | Over budget |
|---|---|---|---|---|
| Even | 62.5 | 16 | 16 | 0 |
| Uneven | 62.5 | 14 | 54 | 5 |
The uneven trace even has a better p95 under this definition. When a fixed fraction of frames misses the budget, compare multiple tail metrics and retain the raw sequence.