Repository navigation
Conversation
On the Mac the GPU's performance controller raises the clock for a shorter deadline by about 100 MHz a second. A probe back to hold 1 had 30 grace frames: Breath of the Wild on an M5 Pro saw the clock rise 338 → 432 MHz and the GPU time fall 24.8 → 18.5 ms over a probe, which then failed, and the game stayed at 30 or 20 fps for minutes until a menu. A grace window whose second half costs at most 95% of its first (FSTEP_RAMP) and had a late frame now starts another, up to 180 frames in all (FSTEP_PROBE_MAX); a flat cost ends the probe as before. General, in the pure controller (nvn_fstep.h); DM_FSTEP_PROBE_RAMP=0 turns it off, ab compares it in one run. One 470 s run with the rule switched every 30 s: after the first 80 s every probe held, 11 in a row, each within about a second; the failures were in a phase with the rule off. t_fstep: a falling cost holds with the rule and fails without it, a flat cost lasts 33 frames as before, a cost that stalls ends one window later, one that never fits ends at FSTEP_PROBE_MAX.
moretti
force-pushed
the
fstep-probe-ramp
branch
from
November 3, 2026 06:54
cc29495 to
3ef873f
Compare
seedds
added a commit
that referenced
this pull request
Nov 3, 2026
…r: on the Mac the GPU clock rises for the shorter deadline over seconds, and Breath of the Wild no longer stays at 30 or 20 fps after a heavier scene (#1042) A grace window whose second half cost at most 95% of its first and had a late frame starts another, up to 180 grace frames in all (nvn_fstep.h FSTEP_RAMP, FSTEP_PROBE_MAX). DM_FSTEP_PROBE_RAMP=0 turns it off. Co-authored-by: moretti <1186409+moretti@users.noreply.github.com>
Owner
|
Landed on main as 0fd9b1c, with you credited as co-author. |
Know-It-All-Brother
pushed a commit
to Know-It-All-Brother/nxnative
that referenced
this pull request
Nov 9, 2026
…r: on the Mac the GPU clock rises for the shorter deadline over seconds, and Breath of the Wild no longer stays at 30 or 20 fps after a heavier scene (seedds#1042) A grace window whose second half cost at most 95% of its first and had a late frame starts another, up to 180 grace frames in all (nvn_fstep.h FSTEP_RAMP, FSTEP_PROBE_MAX). DM_FSTEP_PROBE_RAMP=0 turns it off. Co-authored-by: moretti <1186409+moretti@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Split out of #930 (2 of 4).
Summary
The Mac raises the GPU clock for a shorter deadline slowly, about 100 MHz a second. A frame-step probe back to hold 1 had 30 grace frames, which is too short for that, so the probe failed and the game stayed at 30 or 20 fps for minutes until a menu.
The change is in the pure controller (
nvn_fstep.h), so it holds for every game.DM_FSTEP_PROBE_RAMP=0turns it off;abcompares it in one run withDM_AB.Docs:
docs/reference/frame-rate.md("A probe's grace lasts while its frames keep getting cheaper"), its symptom line, and the Breath of the Wild note.Evidence
After: in a 470 s run with the rule switched on and off every 30 s (
DM_FSTEP_PROBE_RAMP=ab), every probe after the first 80 s held: 11 in a row, each within about a second. The probes that failed (presents 3834, 3929, 4083) were all in phases with the rule off.t_fstep70 checks (64 onmain): a cost falling 0.6% a frame fails the probe without the rule and holds with it; a flat cost, a cost that stalls at 1.3 and a cost that falls without reaching the hold end at 33, 63 and 183 frames.main: host and CPU gfx tests, sanitizers, tool tests, clang-tidy and ruff/pyright pass locally.Merge Danger
Door: two-way.
DM_FSTEP_PROBE_RAMP=0turns it off.Blast Radius: frame pacing.
This changes the frame step for every game that has one, on every platform, iOS included: a probe can now last up to 180 frames while its frames keep getting cheaper. A flat cost still ends a probe after 30 frames, as before.
regress.py impact: Breath of the Wild, Pokémon Scarlet and Tears of the Kingdom. None of them is on this machine, soregress.py check --gameswas not run. Measured only on Breath of the Wild on the Mac.