The iPhone log of the 2026-10-21 speed IPA had the right speed (game time 0.996 of real time, 60
updates a second) but 20 fps in battle at thermal state 0. After a GPU spike the frame step raised
the hold to 2, then 3 vsyncs. The iPhone lowered the GPU clock to the hold: the battle's GPU time
went from 10 to 41 ms a frame at the same draws, and the hold never came back.
AoC's updates step by the cap whatever is shown, so holding frames only paces the screen. A new
profile key, fps_hold (game.py DM_GAME_FPS_HOLD; hle_nvn.c fstep_hold, DM_FPS_HOLD=on / off also
from env.txt), turns off the raise above the cap's vsyncs: kmax = kmin. Each frame is shown as
soon as it is ready. AoC sets it off. The default stays on (Breath of the Wild, Tears of the
Kingdom).
On the Mac: held 1 / 2 / 3 vsyncs 1800 / 0 / 0, battle frame p50 17.5-18 ms on a loaded machine,
game time 0.997 of real time, 60 updates a second.
Also AoC's cb_extent.tsv for chain a9687d01ebfa (cb_extent.py over the Mac build: 27,499 shaders
with bounded uniform reads, 40 storage slots never written). Its first battle renders as before
on the Mac with the new partial uniform updates.
IPA HyruleWarriorsAgeOfCalamity-2026-10-21-nohold.ipa, built from 3de606f plus these changes,
awaits an iPhone test.