A phone that averages 119 FPS can feel worse than one locked at a stable 60 FPS. For competitive mobile gaming, consistency beats peaks. This benchmark framework shows how to quantify stutter, track thermal-induced throttling, and evaluate true playability.
Most gaming reviews still headline with a single number: average frames per second. For system designers and RF engineers, that number hides more than it reveals. Two devices can report an identical 59.8 FPS in Genshin Impact, yet one delivers buttery panning while the other visibly hitches during combat. The difference is not throughput — it is timing variance.
This analysis breaks down the frame time pipeline from application to photon, defines stability metrics that correlate with human perception, and presents a reproducible test rig for continuous 30-minute thermal stress. If you are validating a SoC, tuning a game, or choosing a daily driver for esports, stability testing is the only metric that matters.
1. Why Average FPS Is a Misleading Metric
Average FPS is an arithmetic mean over hundreds or thousands of frames. It collapses a complex distribution into one number, completely obscuring outliers. A 60-second session at 60 FPS contains 3,600 frames. If 3,540 frames render in 16.6ms but 60 frames spike to 45ms due to shader compilation or thermal throttling, your average remains 58.9 FPS — nominally excellent. Yet the player experienced 60 distinct hitches, one per second.
Perceptual research shows the human visual system is acutely sensitive to change in motion, not absolute rate. A locked 45 FPS often feels smoother than a variable 55-60 FPS because the velocity is predictable. This is why competitive titles like PUBG Mobile and Call of Duty: Mobile offer 60, 90, and 120 FPS caps. A stable cap reduces DVFS hunting and lets the compositor schedule consistently.
In our lab, we therefore prioritize three stability derivatives over averages: 1% and 0.1% lows (the worst 1% of frames), frame time standard deviation, and jank percentage — the share of frames exceeding the target budget by >50%.
2. Frame Time Anatomy & The 16.6ms Budget
At 60Hz, each frame has exactly 16.67ms to be produced and presented. At 120Hz, that budget halves to 8.33ms. Miss the v-sync deadline and the Hardware Composer holds the previous frame, creating a duplicate that the eye perceives as a stutter. Miss by a small margin repeatedly and you get micro-judder. Miss by a large margin and you get a visible freeze.
| Feature | 5G NR | Wi-Fi 7 | Bluetooth 5.4 |
|---|---|---|---|
| Peak Throughput | 20 Gbps | 46 Gbps | 2 Mbps |
| Latency | 1–4 ms | 1–2 ms | 3–6 ms |
| Range | Several km | 30–50 m | 100–400 m |
| Power Draw | High | Medium | Ultra-low |
| Primary Use | Cellular data | Local networking | Peripherals/IoT |
A single frame traverses five major stages:
- Game Logic & CPU Submission (2-4ms): Physics, AI, and draw call preparation on big cores.
- Render Thread & Driver Overhead (1-3ms): Vulkan/OpenGL command buffer translation. Sensitive to CPU frequency.
- GPU Execution (4-9ms): Vertex, fragment, and compute. Scales with resolution and shader complexity.
- SurfaceFlinger / Hardware Composer (0.5-2ms): Compositing and buffer queue management. A common source of extra latency if triple-buffering is forced.
- Display Scanout (0-16ms until next v-sync): The panel reads the buffer. On LTPO displays, variable refresh can hide minor variance.
Tools like Android's dumpsys gfxinfo framestats and Snapdragon Profiler expose per-stage timing, but for benchmarking we aggregate to frame-to-photon latency. The distribution shape tells you where to optimize: a long-tailed distribution with spikes typically indicates thermal throttling or garbage collection; a wide, noisy distribution suggests unstable CPU governor behavior.
Understanding the mobile RF frontend architecture is also relevant, as sustained modem activity for multiplayer gaming adds thermal load to the SoC package, directly competing with the GPU thermal headroom.
3. Lab Methodology: How We Measure Stability
To create reproducible stability data, we built a rig that avoids the pitfalls of in-game FPS counters, which often sample only the render thread.
Hardware & Environment
- Controlled ambient: 23°C ±1°C, forced airflow blocked to simulate handheld case insulation
- Display brightness 200 nits, adaptive brightness and refresh off unless testing LTPO behavior
- Device preconditioned with 5-minute warm-up run; battery 60-80% to avoid low-battery throttling
- GameBench, Perfetto, and custom FrameCapture via
Choreographer.FrameCallbacklogging simultaneously
Software Capture
We log every vsync interval at nanosecond resolution. On Android 14+, FrameTimeline via Perfetto gives GPU completion timestamps without root on user builds. For older devices, we use a lightweight overlay that hooks SurfaceView.
# Start Perfetto trace with FrameTimeline & CPU freq
adb shell perfetto -c - --txt -o /data/misc/perfetto-traces/trace.pftrace <<EOF
buffers: { size_kb: 81920 }
data_sources: {
config { name: "linux.ftrace"
ftrace_config {
ftrace_events: "sched/sched_switch"
ftrace_events: "power/cpu_frequency"
ftrace_events: "gfx/*"
}
}
}
data_sources: { config { name: "android.frame_timeline" } }
duration_ms: 1800000 # 30 min thermal soak
EOF
# Pull and convert to frame time CSV
adb pull /data/misc/perfetto-traces/trace.pftrace .
traceconv --to-csv trace.pftrace > frametimes.csv
# Quick jank classification (python)
# jank = frame_time > target * 1.5 (25ms @ 60Hz, 12.5ms @ 120Hz)
Each test consists of a deterministic 30-minute sequence: 10 minutes of open-world traversal, 10 minutes of combat/particle-heavy load, and 10 minutes of repeated stress loop to force thermal steady-state. We run three passes and report the median. Critically, we do not reboot between phases — we want the throttling curve.
This approach mirrors rigorous mobile API performance and edge delivery testing where tail latency (p95/p99) matters more than median latency for user experience.
4. Thermal, DVFS & The Display Pipeline
The single largest driver of frame time variance on modern flagships is not shader complexity — it is temperature. Sustained gaming pushes skin temperature toward the 43-45°C regulatory limit, triggering a cascade.
Phase 1 (0-8 min): SoC at peak — CPU big cluster at 3.1GHz, GPU at 900MHz. Frame times tightly clustered around 12ms for a 60 FPS title with ~4ms budget headroom. Std deviation <1.2ms. Jank <1%.
Phase 2 (8-18 min): Skin sensor near 42°C. Kernel thermal daemon steps GPU down in 70MHz increments. CPU migrates threads to efficiency cores. Frame time distribution widens; you see a bimodal histogram — most frames still on target, but periodic 22-28ms spikes as DVFS transitions stall the pipeline.
Phase 3 (18-30 min): Steady-state throttling. Some OEMs implement aggressive frame capping (e.g., lock to 45 FPS) to stabilize timing. This is perceptually superior to allowing oscillation between 58 and 42 FPS, but benchmark headlines rarely capture it.
Passive cooling design, vapor chamber size, and even mobile camera autofocus PDAF/laser modules placement can affect thermal maps — a heat pipe routed near the camera island can create a localized hotspot that triggers early sensor throttling even while the SoC is still within limits.
5. Comparative Results: 60 vs 120Hz Stability
We ran the same 30-minute Genshin Impact test (Highest Settings, 60 FPS cap and 120 FPS cap where supported) on four 2025-26 flagships with active cooling disabled. Ambient 23°C. Values are median of three runs.
| Device (SoC / Cooling) | Target / Avg FPS | 1% Low (FPS) | Frame Time σ | Jank %* | Verdict |
|---|---|---|---|---|---|
| Device A 8 Gen 3 • Vapor Chamber 4,200mm² | 60 / 59.6 | 51.3 | 1.4 ms | 2.1% | Locked Stable |
| Device B 8 Gen 3 • Vapor Chamber 3,800mm² | 60 / 58.9 | 42.7 | 3.1 ms | 7.8% | Bursty Jank |
| Device C Dimensity 9300 • Graphite Only | 60 / 58.1 | 36.2 | 4.8 ms | 13.4% | Throttle Heavy |
| Device D 8 Gen 3 • Active Cooler Clip | 120 / 112.4 | 78.1 | 1.9 ms | 4.2% | Excellent @120 |
*Jank = frames exceeding 150% of target interval ( >25ms @60Hz, >12.5ms @120Hz ). 120Hz test throttled to 112.4 avg but maintained low variance due to external cooling.
Several insights emerge. Device A and B share the same SoC, yet Device A maintains 2.1% jank while B shows 3.7× more. The difference is thermal mass and governor tuning, not silicon. Device C's graphite-only solution collapses after minute 14, with 0.1% lows dropping to 28 FPS — unplayable in abyss combat. Device D demonstrates that even at 120Hz, a tight distribution with modest under-average performance feels better than a higher average with wild swings.
Note on power: Device D with the cooler clip burned 11.2W sustained vs. 7.8W for Device A. Without the clip, the same phone throttled to 67 FPS at 120Hz mode with 11.9% jank. Battery and thermal budgets are fungible — OEMs choosing thin and light trade sustained stability for burst performance. Secure hardware like the NFC secure element for mobile payments also shares the PMIC rail, and we observed 80-120mW extra draw during background wallet polling, enough to tip borderline devices into throttling one minute earlier.
6. From Jank to Flow: Optimization Checklist
Whether tuning a game or building a device, stability work focuses on removing variance sources.
For Gamers & Reviewers
- Cap deliberately: If a game offers 60/90/120, choose the cap your device can hold with <3% jank for 20 minutes. A locked 60 beats a fluctuating 90.
- Lower resolution, not just effects: GPU time scales linearly with pixel count; dropping from 1440p to 1080p saves ~2.5ms on Adreno 750, enough to restore budget headroom under throttle.
- Use performance mode wisely: Many OEM performance modes raise thermal limits from 43°C to 45°C and keep big cores online longer — useful for 15-minute matches, not 3-hour sessions.
For Developers & OEMs
- Precompile shaders: Mid-game PSO compilation stalls are the #1 cause of single-frame 40ms+ spikes. Use Vulkan pipeline cache warm-up on first launch.
- Schedule on mid cores: Pin render thread to Cortex-A715/A720 rather than X4; slightly slower but immune to X-core throttling.
- Adaptive resolution: Dynamically scale render resolution to keep GPU occupancy below 85%, preserving >2ms slack for DVFS dips.
- Frame pacing API: Use Android Frame Pacing library or
ASwarmto align swap to vsync and avoid buffer bloat. Misconfigured triple buffering alone can add 16ms of input latency.
The broader lesson connects to all mobile subsystems — autofocus motors, RF chains and payment SEs compete for the same power and thermal envelope. Holistic system tuning, as explored in our edge delivery performance guide, wins over isolated component maximization.
In short: advertise stability, not peaks. A device that delivers 58.5 FPS with 1.6ms σ and 2% jank is objectively better for gaming than a device that advertises 61 FPS but stutters 14% of the time. As 120Hz LTPO becomes standard and ray tracing arrives on mobile GPUs, the timing budget will only tighten — making frame time analysis indispensable.
Frequently Asked Questions
FPS counts how many frames were rendered per second, an average. Frame time measures how long each individual frame took in milliseconds. At 60Hz the budget is 16.6ms per frame; frame time reveals stutters that average FPS hides, such as a single 45ms hitch in an otherwise smooth session.
Jank is a frame that misses its v-sync deadline, typically defined as >150% of the target interval (>25ms at 60Hz, >12.5ms at 120Hz). Under 3% jank is excellent, 3-6% is noticeable to sensitive players, and above 8% feels consistently stuttery. Competitive players should target <2% over a 30-minute thermal soak.
Thermal throttling. The SoC reduces CPU and GPU frequencies when skin temperature approaches 43-45°C to protect the user and battery. This adds 5-15ms to frame time, creating periodic stutter. Better cooling, lower graphics settings, or capping FPS to 60 reduces heat and stabilizes performance.
For most players, yes. The visual system is more sensitive to variance than absolute rate. A locked 60 FPS with 1.4ms standard deviation feels smoother than 90 FPS that swings between 72 and 90 FPS with 4ms deviation. Lock to the highest refresh rate your device can sustain with <3% jank.