Game: Hyrule Town spin costs ~30% fps (Deck LCD) - GPU-written 691x432 texture re-uploaded per present + page-capture storm #750
Labels
No labels
area/accessibility
area/audio
area/input
area/install
area/menu
area/renderer
area/saves
area/upscaling
beanstalk: approved @ 1697603
beanstalk: approved @ 2c5a62e
beanstalk: approved @ 4fd82b7
beanstalk: approved @ 64d6d09
beanstalk: approved @ 6f91fae
beanstalk: approved @ 70a78f9
beanstalk: approved @ 8015c9a
beanstalk: approved @ 8d361dc
beanstalk: approved @ 9d8356e
beanstalk: approved @ abf2227
beanstalk: approved @ d82f202
beanstalk: approved @ e5f1e40
beanstalk: approved @ ee8ab5f
ci: approved
good first issue
gpu/amd
gpu/igpu
gpu/intel
gpu/nvidia
help wanted
kind
bug
kind
chore
kind
docs
kind
feature
kind
performance
kind
question
needs measurements
platform/linux
platform/macos
platform/steam-deck
platform/windows
preview
priority
critical
priority
high
priority
low
regression
status
blocked
status
confirmed
status
duplicate
status
invalid
status
needs-info
status
wontfix
testing wanted
ci: approved
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot#750
Loadingβ¦
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Deck LCD (Jupiter/Vangogh, 8 logical CPUs), game on the SD card. Found while running our scene benchmark: a new scene-pack save ("First Step into Hyrule Town", one of the save-state packs we swap per arm) loads and idles fine at ~25-27 fps, but the moment a full-speed camera spin starts, frame rate collapses to 2.0-5.9 fps (4 of 6 samples) and stays there for seconds. Walk after it recovers (~31). Draw counts during the stall are nearly flat (6,061 -> 6,077 across the sampled window) - the replay thread is spending its wall-clock elsewhere, not drawing.
What the log shows during the stall (
longshot_log.txt, this exact arm, present numbers from the same window as the fps samples):A 691x432 texture that the GPU itself wrote (flags 0x8) is being re-uploaded every few frames, and consecutive presents at 6055/6056 show the pipeline crawling while that loops. Hyrule Castle on the same save lineage runs 29-30 fps stable in the same protocol, and Kokiri Village never stalls this hard, so something about Town's spin view arms the loop.
Build: main
a4821d56(rendererf1e064e34a99), cap row 3 (the game logsframe rate cap 144), vsync off, FSR3.1 at 50%,RX_VK_READBACK_LATE=newest, threaded off, Deck desktop mode with GPU pinnedhigh+ governorsperformance(so the stall is not a clock ramp - sclk was locked 1600 MHz).Question for the p0lux PRs: is this the case #590's "no-mirror unread bookkeeping" and "a lock taken for every sampled texture" should shrink, and #567's written-range-only checks help? If so I can run this exact save + spin arm against pr-590/pr-567 branches and report LCD numbers (our Deck is Jupiter/Vangogh LCD - same GPU as OLED, ~1100 MT/s slower memory; the OLED-only tested figures probably understate this one). Happy to also send the full log and the bridge screenshots from the stall frames.
Scope, from a 9-save sweep on this same Deck (rt-main
a4821d56, SD storage, GPU pinned 1600 MHz + performance governors, FSR3.1/50%, all env pins; medians, idle/spin/walk fps, draws column = steadydraw calls per framefrom the frame report):Every other scene sits at 29-45 fps in all three phases with draw counts in the same 5-6.6k range. The Town is the only place where a camera spin takes 25 fps idle to 2-6 fps and back. Draws stay ~5.6-6k throughout the stall (6,061 -> 6,077 across it), so it is not draw-count blowup - it is the per-present re-upload/capture cost in the report above. One more data point that this is specific to whatever the Town save has (map minimap? town's always-on textures?) rather than "busy scene = slow".
p0lux's #567 (all-zero check reads only written pages) and #590 (replay-thread bookkeeping) are being built as runtimes on this exact setup right now; I'll post before/after against the Town save when the arms finish. Deck LCD (Jupiter/VANGOGH) throughout.
Game: Hyrule Town save collapses to 2-6 fps on a camera spin (Deck LCD) - GPU-written 691x432 texture re-uploaded every frame + 714k-page capture stormto Game: Hyrule Town spin costs ~30% fps (Deck LCD) - GPU-written 691x432 texture re-uploaded per present + page-capture stormTitle correction from the reporter, with the fair numbers.
The original title ("collapses to 2-6 fps") measured my v3 protocol, which at an entrance save sat idle/spin right on the level-loading boundary - Angela caught it watching live ("your numbers for castle town will be messed up by level loading"). Re-measured all three runtimes with a v4 protocol: load -> walk ~10 s INTO the town (spawn faces inward) -> 20 s settle so streaming finishes -> idle samples -> full-speed spin. Same save, same config (rt-main
a4821d56, GPU pinned 1600 MHz + performance governors, FSR3.1/50%, SD storage).Honest restatement: idle in town is clean at ~26 with no dips. The spin drop is real and reproducible - about a 30% fps loss (25.9 -> 18.6 median) - and the mechanism from the original report is still live in the logs (the GPU-written 691x432 texture re-uploaded per present, page-capture counts, 12-20
re-uploadedevents per arm run). The 2-6 fps collapse is not the steady behavior at this spot; it shows up as an occasional single-sample dip, and sustained 2-6 is what the loading boundary produced, not the spin itself. Severity downgraded from "catastrophic stall" to "steady ~30% spin degradation with occasional deep dips"; title edited to match. Draws column above is post-walk-in, so the scene being measured is deeper in town than the original table's 5.6k.p0lux's #567 and #590 (the two PRs targeting this path) did NOT fix or meaningfully shrink the drop on this Deck LCD - separate comments on both PRs have the numbers and the cold-pipeline-cache confound. Deck LCD (Jupiter/VANGOGH), not OLED.
Tried on a Steam Deck OLED on current main, without your save. The camera spin at the Market's entrance cost about a tenth of the frame rate here, with single-second dips to 9β11 fps. The re-upload of a GPU-written texture did not show.
Build and Deck: main
0557080f, a Linux build (x86-64-v3, LLVM 23.1.5). Steam Deck OLED (RADV VANGOGH, Mesa 26.2.0-devel), SteamOS 3.9.5, docked. GPU pinned at 1600 MHz; CPU governors left as they are.Settings: yours:
fsr3: 640x400 -> 1280x800)RX_VK_READBACK_LATE=newestFrame generation was off. Plus
RX_VK_LOAD=create: without it, main keeps every noted graphics pipeline ready before the title and runs out of memory on this Deck at start-up.How the Market was reached: the control bridge's debug teleport (
Market_Child, the Market's entrance) from a Kokiri Forest save, not your "First Step into Hyrule Town" save. Arriving this way may differ from your save, for example in the time of day or what has loaded.Then your v4 protocol: walk in for 10 s, settle 20 s, idle 15 s, a full-speed camera spin for 20 s, walk 10 s. The game's frame rate was read every second through the bridge. 2 runs:
re-uploadedlines in the Marketupload over a drawn imagelinesre-uploadedline was a texture the CPU wrote (flags 0: 1144x3056 x3 and 576x576 ones). None was GPU-written (flags 0x8), and no 691x432 texture appeared.So on this OLED at the Market's entrance, the spin costs about a tenth rather than a third, and the loop in your report did not appear. Whether your save or the LCD is what brings it on is not shown here.