fix(runtime): let the floor web react above 60 fps #49
No reviewers
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
needs measurements
question
testing wanted
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot!49
Loading…
Reference in a new issue
No description provided.
Delete branch "mooki/Longshot:fix/web-floor-step-carry"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
The Deku Tree floor web stops reacting when Link jumps on it above 60 fps. This restores its movement in the Linux/RTX 4090 test, not every above-60 gameplay issue.
What changed
f_80652cb0truncates elapsed time divided by 1/60 to whole simulation steps, so a sub-one update becomes zero.WHOLE_SITESentry innx2/oot_patches.pyuses the existing fractional carry to retain that remainder per web object before the unchanged 0..3 clamp; no new runtime helper, switch or logging.tests/test_web_floor_steps.pyis an authored game-free test of the selected site, independent objects, the clamp and long pauses.docs/tested-configurations.mdrecords each measured run and the rejected attempt; the earlier Hookshot row is unchanged.Flags and settings
No game flags or settings are added or changed. The new authored test exposes only this compiler selector, documented in its own usage text; the existing gameplay/testing switches below are not changed.
tests/test_web_floor_steps.py --ccgccMeasurements
Branch state: on main
f41db065cf6667ec638a10aa6990099392d10dca; head7f840c0ae592364fa8110a2d73ded06118519e0d; whole game-free suite on this head:510 passed, 0 failed, 19 skipped(mainf41db065cf6667ec638a10aa6990099392d10dca:509 passed, 0 failed, 19 skipped); the commits are unchanged by rebases apart from the results table.Known local failure:
tests/test_updater_asset_digest.pyfails withNU1100: Unable to resolve 'Microsoft.AspNetCore.App.Ref (= 10.0.13)' for 'net10.0'. The same test fails with the same diagnostic on pinned maind3bd2805. No test was weakened or package installed; this is not an all-green suite. The 20 skips are declared platform/game prerequisites. That test left main together with the in-game updater, so the suites in the branch-state block no longer contain it.main:
d3bd280503(2026-11-12, UTC commit date)this PR: move/fix-web-floor-step-carry-r2 @ 27375dbe99ef96dfb55b0be585a5852cba05b4bf
Hardware: RTX 4090, NVIDIA 615.78.08; Core i9-13900K, 94 GiB usable RAM; Arch Linux 7.2.15-1-omarchy; 2026-11-12, windowless
Scene: Deku Tree floor web, same save and camera; interior, time of day not varied; 1280×720, game's own 50% render scale (640×360), frame generation off, real-time game speed, caps 60/240, no mods
Method: three scripted jumps per run after at least 10 s in the scene; about 11 s of observations each. At cap 240, two interleaved pairs (main, fixed, main, fixed) in one 150.6 s exclusive GPU session, with no other GPU test work. The other runs used shared load. Read-only snapshots of the web's step count, changing ring indices and four central heights, plus
HOS_PRESENT_TRACECPU intervals. No added entry tracer or memory writes.How to reproduce: use a disposable save at the centre of the Deku Tree floor web in your own test install; use the scene settings above, wait at least 10 s after arrival, stand for 2 s, then jump three times, 3 s apart. Use the menu cap 240 (or
HOS_FPS_MAX=240) and verify actual game presents exceed 60; repeat main, this PR, main, this PR. Repeat the control with cap 60 and the override unset. Runpython -I -B tests/test_web_floor_steps.pyfor the authored fixture andpython -I -B tests/run_all.py --jobs 6 --strictfor the full game-free suite; the low-level observer was read-only and no save or game data is published.The main suite was run once for all moved pull requests; this branch's suite was run once. Commands: main
python -I -B tests/run_all.py --jobs 6 --strict; this PRpython -I -B tests/run_all.py --jobs 6 --strict. The inherited local failure is named above, not counted as an all-green result.Retained Longshot game measurements
Baseline: main @
d3bd2805(Longshot measured build)These are the measured builds, not new runs on the current heads: main
d3bd280503and this PR's measured source 27375dbe99ef96dfb55b0be585a5852cba05b4bf. The later original commit only added results rows. Both full builds used the verified Hookshot v2.1.0 release play profile.Table cells are achieved game presents/s; intervals below 16.7 ms; observed updates / steps delivered / distinct four-height vectors. The median row is steps/s. These rates establish the above-60 test condition; this is a correctness result, not a speed comparison or display/GPU-completion measurement.
d3bd2805(Longshot measured build)Earlier Hookshot measurements, before the rename
Baseline: Hookshot main + local entry tracing @
e2057b2bThis historical comparison is retained from the original pull request, not a current-main rerun: the baseline is the old pinned Hookshot source plus local entry tracing, and the fixed build is the original floor-web change. It is not a speed comparison with current Longshot.
e2057b2bBoth held main runs delivered zero steps and kept one height vector; both fixed runs delivered about 60 steps/s and hundreds of changing vectors. The ordinary main run's nine one-step observations are expected when some updates last a whole frame: its other 924 updates yielded zero. The ordinary fixed high-cap attempt stayed below 60 and was rejected before its counters were read. The cap-60 control reacted, but under load it reached only 34.864 presents/s; it is not a sustained-60-Hz proof.
The earlier Hookshot rows are carried from the original pull request, not reruns. Their baseline used local entry tracing and a different base, so they are not a matched speed comparison with Longshot. New counts mean observed ring-index changes, not an added entry counter; held sampling covered at least 99.79% of present numbers. The heights are read from the web itself, so camera movement cannot be mistaken for web movement.
Observation output and build identities:
Earlier, on the measured source 27375dbe, I ran the whole game-free suite locally, with the repository's default compiler selection and the exact command
python -I -B tests/run_all.py --jobs 6 --strict. These checks have not yet been run on a forge runner.The new floor fixture passes here; against main it fails, including:
Windows-target syntax on the measured Longshot code passed one captured C unit (the unchanged fixture is carried across the rebases, not rerun here); Windows execution was not run. Every Longshot game run exited 0, with no fatal, crash, device-loss or kernel-driver fault and complete journal coverage.
The comparison was built and run on main
d3bd2805. Afterwards the branch was rebased onto maind4a69456without any change (range-diff equal for all three commits); the commits in between do not touchnx2/oot_patches.pyor the host frame-step mechanism, and the floor test passes on the rebased branch. It was not rebuilt or rerun in the game after that rebase.The measured builds remain on
d3bd2805; the newer maind725b3631adds preparation/bug-report changes, save tools and forge scripts/docs/tests but does not touch the patched file or frame-step mechanism, confirmed by an emptygit diff d3bd2805..d725b3631 -- nx2/oot_patches.py host, includinghost/frame_whole.h,host/nn_vi.candhost/oot_high_fps.c/.h.All three range-diff entries remain equal. No new build or game run was made.
Testing
Tested: on this PC (Arch Linux, RTX 4090 with NVIDIA 615.78.08, i9-13900K), the whole game-free suite and the floor-step fixture, including its expected failures against main; Windows-target syntax checked one C unit, not Windows execution. In the game, the Deku Tree floor web at 1280×720 and 50% render scale, frame generation off: after at least 10 s in the scene, three jumps per run, main/fixed/main/fixed at cap 240 with actual presents above 60, plus the shared-load controls described above. The step counts and web heights, normal exits and driver logs were checked. Tested but not measured: the rejected shared-load cap-240 candidate completed the three jumps, but its deformation counters were deliberately not examined because the above-60 prerequisite failed; no other gameplay is claimed.
Not tested: Intel and AMD gameplay; other interactive floors such as the flying carpet; long play, web-breaking progression, swapchain/display timing, or sustained 60-Hz Longshot play. The runs were bounded to the stated web scene on this PC, and the cap-60 control was below 60 under load. The updater is shared by interactive floors, so those remain a risk. No cross-hardware test request has been opened. Above-60 play remains experimental.
Needs other testers:
Screenshots
main @
d3bd2805: panels 1 and 2, cap 240, standing and jumping with the web frozen. this PR @ 27375dbe: panels 3 and 4, cap 240, the web bends and rises; panels 5 and 6, cap-60 control under shared load. These captions name the actual measured builds, not the rebased heads.Risk and rollback
The updater is shared by interactive floors, including the flying carpet: retaining fractional steps could change an untested floor's animation or interaction. The existing 0..3 clamp and cap-60 path remain unchanged. Revert this PR to remove the table entry and its regression test if it regresses another floor; there is no runtime switch for this fix.
Reviewer notes
Start with the
f_80652cb0entry innx2/oot_patches.py'sWHOLE_SITES, thenpatch_whole_framesandtests/test_web_floor_steps.py. The key keeps each object's fraction separate; no shared mechanism was refactored. The docs rows and uploaded picture are retained across the rebases. The limited hardware/area coverage is explicit above; this update changes the branch base and description, not the fix or measured evidence.Issues
Fixes #86
Original bug report: https://github.com/NotRexed/Hookshot/issues/2667.
Checklist
For everyone
type(scope): description).main.python -I -B tests/run_all.pyrun and passing (any failure that also fails onmainis named above).third_party/untouched (a new folder with aPROVENANCE.mdinstead).If applicable
Assisted-by:/Co-Authored-By:trailers.docs/tested-configurations.mdfor each measured run.mainand passing here.Moved from NotRexed/Hookshot#2929.
Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra [email protected]
fix(runtime): let the floor web react above 60 fpsto WIP: fix(runtime): let the floor web react above 60 fpsBack to work in progress, for its description only. This was opened shortly before #48 merged and follows the earlier template, so it does not pass the new description check (no Flags and settings and no Risk and rollback section, table columns named Before and After). The code and the measurements are unchanged: the whole suite passes on this exact commit apart from one local .NET failure that also fails on main. The description is being moved to the new template and the branch rebased onto
d725b363; it comes back throughpr readyonce the check passes.Rebased onto
d725b3631as440fef872with all three carried commits unchanged. The description now follows the new template, names each measured build and baseline, and keeps the uploaded picture and every earlier result; the description checker passes without WIP. The whole suite on this exact head reports 511 passed, 1 failed and 20 skipped, with only the same missing .NET reference-pack failure as main (510 passed, 1 failed, 20 skipped). The game evidence remains ond3bd2805becausenx2/oot_patches.pyand the host frame-step mechanism are unchanged; the game was not rebuilt or rerun.WIP: fix(runtime): let the floor web react above 60 fpsto fix(runtime): let the floor web react above 60 fps9926c1cba3to440fef872dfix(runtime): let the floor web react above 60 fpsto WIP: fix(runtime): let the floor web react above 60 fpsBack to work in progress for two reasons, neither a change to the code or the measurements. The template gained a Testing section with #72 (what was tested, what was not, and which testers are needed, with test requests), which this description does not have yet. And #39's merge added a row to the results table at the same place as this pull request's rows, so the branch conflicts in that one file until it is rebased. Both are being done; it returns through
pr ready.The description now has the current template's Testing section: what was tested, what was not, and which testers are needed; the test request is open (T-YKGE). Rebased onto main
f41db065ckeeping both sides' rows of the results table; whole suite on the new head7f840c0ae: 510 passed, 0 failed, 19 skipped. Ready for review.440fef872dto7f840c0ae5WIP: fix(runtime): let the floor web react above 60 fpsto fix(runtime): let the floor web react above 60 fpsView command line instructions
Checkout
From your project repository, check out a new branch and test the changes.