Mobile GPUs don't run at a fixed speed. A DVFS (Dynamic Voltage and Frequency Scaling) controller watches chip temperature and steps the clock down when the phone gets too hot to protect the silicon — this is the real cause of a game getting "laggy" ten minutes into a session even though nothing in the code changed.
Heat balance each frame:
P_total = P_idle + clock · workload · P_max
dT/dt = (P_total − h·(T − T_ambient)) / C_thermal
DVFS controller (with hysteresis so it doesn't chatter):
T ≥ 40°C → clock steps to 85%
T ≥ 46°C → clock steps to 70%
T ≥ 52°C → clock steps to 55%
T ≥ 58°C → clock steps to 40% (floor)
clock steps back up once T falls 4°C below its trigger
Rendering cost:
frame_time = base_render_time(workload) / clock
fps = min(fps_cap, 1000 / frame_time)
- Graphics quality sets the per-frame GPU workload — more draw calls, shaders and particles mean more heat generated per frame at full clock.
- Cap at 30 FPS mimics real frame-pacing: capping the render rate cuts power draw (and heat) roughly in half even at the same quality, which is why many mobile games offer a 30fps "battery saver" mode.
- Cooling assist raises the heat-dissipation coefficient h — a bigger heatsink, a cooling clip, or simply a phone lying on a cold table.
- Ambient temperature shifts the equilibrium point the chip settles at — the same workload throttles sooner on a hot day.
- Watch the readouts: as the GPU chip in the scene glows from blue to red, clock % steps down and frame rate follows it down — not smoothly, but in the same discrete steps as the controller.