Pacing tools, a card that backs off, and a test option for a full graphics card. The frame trace and the "What stands out" card are for the next "bumpy pacing" report; Neural Rendering now spares a full card; the upscalers'
motion is right at frame-generation ratios that are not whole numbers; a settings file with nonsense in it cannot break the addons. Nothing here changes a picture unless an option is turned on.
- "Lighter upscaling of generated frames (test)" (the three upscalers, off by default). With frame generation the upscaler runs on every presented frame, and in the owner's HDR 1.5x log that was 3.3 ms of GPU
for each (6.6 ms for each frame the game draws, about two thirds of everything the addons add at the spot where the game fell from 60 to 40 fps). With the option on, the frames the game draws get the full upscaler
and the frames Lossless Scaling makes between them get the last upscaled picture, moved along the motion by their share of the step, checked against the new frame at the scale of a few pixels (where they disagree, the new
frame stretched plainly), and sharpened as usual: under 1 ms instead of 3. A generated frame is recognised by the generated-frame pass that runs before it. Measured offline on four recordings (docs/frame-generation-research.md):
detail and flicker about equal, 0.4 to 0.8 dB lower in fast motion, a little lower on the steadiness score. Not yet seen by eye: flip it with the camera turning and in a calm dark scene. The frame trace marks these frames,
and the log's "frames upscaled" line counts them. - The upscalers' "NIS stays" line is no longer alarming while they work. Lossless Scaling draws a second kind of pass into part of the screen, which the upscaler leaves to NIS; the log said "in a way the upscaler cannot follow
yet ... please report it" about it every 30 s, in logs where 96 % of the frames were being upscaled. Once frames have been upscaled the line says what it is and that it is normal. - The upscalers scale the motion by time, not by a count of presents. With frame generation the upscaler is told how far each presented picture is along from the one before. It took that as 1 over
the number of presents between the last two real frames, which is right for a whole multiplier (x2, x3) but not for Lossless Scaling's adaptive mode or a screen whose refresh rate is not a multiple of
the game's (120 Hz at 50 fps is 2.4 presents to a frame, so 2 and 3 by turns): the step then alternated between 1/2 and 1/3, up to 20 % wrong on every frame, and the motion the upscaler used shook.
It is now the smoothed time between presents over the smoothed time between real frames (the log's "presented per real frame" line says "each 0.42 of a real step"). Unchanged for x2 and x3.
A reported symptom this may explain (bad pacing at 40 to 59 fps on a 120 Hz screen, clean at 25 to 39); not yet seen live. - A settings file with nonsense in it cannot put the addons out of range. A new test feeds every setting a list of bad texts (nan, inf, 1e308, negatives, words, empty). It found that "nan" in
any number got through the limits (a comparison with nan is never true), that a few settings had no limit at all (the model's intensity, fine detail, local contrast, the compose blend, the
per-pixel limit, the protect-bright start, the flow unit, the slow-model watchdog, the tap mode) and that a huge number could overflow the conversion to a whole number. Numbers that are not
finite now read as the setting's default (or, in a look, leave the setting as it was), and every setting is limited to a little wider than its slider. - A reset of the history was lost when its frame was left out (Neural Rendering). "Reset history", a change of the model's size and a rebuild each ask for a reset with the next frame given to the model;
if that frame was left out (the model busy, or its turn off under auto quality's every-Nth setting) the request was spent and the history never reset. It now waits for a frame that runs
(Neural Rendering; the upscalers already kept theirs). - A "What stands out" card in each addon's panel. From the numbers the addon already keeps (how even the game's frames were over the last few seconds, what the model waited for, what auto quality
is doing, what the upscaler costs) it says in plain words what is wrong and what to try: "the game's frame times are uneven... the graphics card is full", "the model waits 9 ms for the card",
"auto quality is running the model on every 2nd frame", "you are looking at the plain picture (the before / after toggle)". It stays empty when nothing stands out. New testnr_diagtest. - A frame trace for pacing problems. The logs keep averages, which is why "bumpy pacing" could not be looked into. The Neural Rendering and upscaler addons now keep a timeline of the last
131 000 events (a real frame arriving, every present, each model run with its GPU start delay, each upscaler pass, auto quality's changes, hotkeys), at a cost of a timestamp and four integers
a frame, and write it tologs\frame-trace-<addon>.csvat shutdown and whenever a recording is saved (Ctrl+Shift+F1).tools/analyze_frame_trace.pyreads it: the interval of the
presented and the real frames (p50, p95, p99, low 1 %), the longest gaps with what else happened around them, whether the model's runs line up with the gaps, and the upscaler's and auto
quality's numbers. Sending that file with the logs is enough to see where a stutter came from. New testnr_tracetest(threads, wrap-around, export). - Neural Rendering's compose pass is about 10 % cheaper in HDR. It is one pass per presented frame (two per real frame with frame generation) and cost 0.94 ms of GPU at 4K in HDR with
sharpening (0.98 in a live log). The sharpening converted each neighbour's SDR view again for every pixel that reads it, and the way back into the frame's encoding made two round trips
through the view that are the identity: now each pixel's view is made once per 8x8 tile and the round trips are replaced by direct light conversions. 0.94 -> 0.83 ms (0.59 -> 0.56 without
sharpening); the result is the same up to fp16 rounding (one half-float step at most; a mean difference of 0.00003). SDR is unchanged. Measured with the newnr_composebench. - Neural Rendering backs off further when the game's frames stay slow. From the owner's log: at the lowest model resolution (the floor, 0.25) the model still took 2 to 6 ms and waited 6 to 22 ms for the
card, and while it ran the game's frame time spiked (p95 17.6 ms with Neural Rendering off, 29 to 31 ms with it on, at the same spot at 60 fps): judder, and what a player described as bumpy pacing. Auto
quality now also runs the model on every 2nd (then 3rd) real frame when the game's frames are still well over the best they have lately managed even at the floor (the presents keep warping the last
result, as they already do while the model is busy), and goes back to every frame after the game has been steady for 10 s (not before 30 s after the last increase). The log says when ("auto: the model now
runs on every 2nd frame"). Only with auto quality on. Not yet seen live.