From 5190f8e932b92cf694d9f8b5a7ef6e52c141de2a Mon Sep 17 00:00:00 2001 From: chrg6 Date: Fri, 13 Nov 2026 09:53:26 -0500 Subject: [PATCH] Make the release 0.10.0, with its notes; the notes of the unreleased 0.9.3 are folded into them. Co-Authored-By: Claude Opus 5.5 --- VERSION | 2 +- docs/releases/v0.10.0.md | 165 +++++++++++++++++++++++++++++++++++++++ docs/releases/v0.9.3.md | 42 ---------- 3 files changed, 166 insertions(+), 43 deletions(-) create mode 100644 docs/releases/v0.10.0.md delete mode 100644 docs/releases/v0.9.3.md diff --git a/VERSION b/VERSION index 2003b639..78bc1abd 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.9.2 +0.10.0 diff --git a/docs/releases/v0.10.0.md b/docs/releases/v0.10.0.md new file mode 100644 index 00000000..87674bfe --- /dev/null +++ b/docs/releases/v0.10.0.md @@ -0,0 +1,165 @@ +## Install or update + +- **Already have 0.6.0 or newer:** start the launcher; it offers 0.10.0, updates itself and keeps the game it compiled + and the shaders it prepared. This update translates the game's code once more, for the new frame-rate fixes, and + compiles what changed: a few minutes, once. +- **Already have 0.5.0:** the same, and the game's code 0.5.0 compiled is kept as it was compiled (for any x86-64 + processor); *Rebuild the Game* in the launcher's home compiles it again for yours. +- **New install:** download **`NX2navi-Setup-0.10.0.exe`** below, put it next to your `.nup` dump of the game and start + it. Windows SmartScreen warns on the first start because the setup is not signed: choose *More info* and *Run + anyway*. The launcher checks your game files, builds the game (10 to 25 minutes, once), prepares every shader and + starts it. + +**Requirements:** Windows 10 or 11; an x86-64 CPU with SSE4.2; 16 GB of RAM; about 30 GB free for the game and 1.5 GB +for the launcher; a GPU with Vulkan 1.3 and `VK_EXT_external_memory_host` (current NVIDIA and AMD cards). A GPU without +`VK_EXT_mesh_shader` gets the mesh shader fallback as before, or runs the game's mesh shaders as compute shaders with +`low_end_gpu = 1`. + +## Fixed above 60 fps + +These are game patches, on by default; each has a setting to turn it off. + +- **Moving platforms carry Link again above 100 fps** (`floor_carry`). Above 100 fps the game's character controller + kept only a tenth of a moving floor's speed, so the Deku Tree's floating platform slid out from under Link. It now + carries him as it does at 60 fps. +- **Webs and water spring back at any frame rate** (`water_steps`). Spider webs sink and bounce under Link and water + surfaces react to him, their simulation stepping 60 times a second whatever the frame rate. Up to 64 such surfaces + at once. +- **Sound and music no longer go silent after a few loading zones** (`sound_steps`): the game's sound manager runs at + 60 Hz with whole steps. +- **Water ripples keep moving** above 60 fps, and **movie events follow the picture's own timestamps** + (by automata.). + +## Faster, with fewer stutters + +- **The next frame starts while the graphics card finishes the last one, on by default** (`tail_early`; by + epicmeme546). The game used to wait until the card had finished the whole previous frame, upscaler and interface + included, though nothing it reads comes out of that last stretch. Standing in Hyrule Field on a Radeon RX 7900 XT + with FSR 4: 50.7 instead of 42.5 fps, 63.5 instead of 49.4 with three CPU helper threads, and 56.0 instead of 45.9 + along a route; 51.8 instead of 47.8 with FSR 3.1. It acts with TAA, DLSS, FSR 3.1 or FSR 4 on AMD cards; on NVIDIA + and Intel cards it changes nothing yet. A frame that would hand the game anything else runs as before. Off: + `tail_early = 0`, or the settings menu's Game tab, Testing, *Start next frame early*. +- **CPU helper threads are Automatic** (`replay_workers = auto`): the draw replay uses a number of helper threads + chosen from your processor's cores. None on 4 cores or fewer, and none on Radeon RX 6000 cards and older, where + some players' games lost the graphics device with them on. +- **More pipelines are built before play.** The shipped pipeline list holds 9,814 pipelines and their shaders, about + 960 more than 0.9.2's, taken from play: a new install builds them while it prepares instead of meeting them in + play. +- **Large textures are copied out of the game's memory on several threads** (`par_jobs`): a texture of 1 MiB or more + is copied two to three times faster when it first appears, the same bytes as before. +- **Fewer foliage hitches:** mesh pipelines link from stage libraries, which are built ahead at the preparation and at + boot, and a mesh draw waits for its fast link instead of being left out. +- **The pipeline cache** is at least 1024 MB, its limit set from your RAM, and kept under it when written (by + Leyukaka): on a 64 GB PC with an RTX 5080 the pipelines found in the cache at boot went from 14 to 84 %. The + graphics driver's own shader cache is checked at normal priority, carries on where it stopped, is rebuilt at an + update only when the driver lost it, and is warmed on the boot screen after a driver change. +- **Shader translation and compute preparation work is reused** (by automata.), repeated index-buffer binds are + skipped, and log writes are batched. +- **Experimental, off by default:** *Helpers work ahead* (`replay_pipe`, 0 to 4) and *Helpers take small jobs* + (`replay_small`, 0 to 63; by epicmeme546). In Kokiri Forest on the RX 7900 XT, with the early tail on: 62.2 fps with + five helpers and `replay_pipe = 4`, 63.2 with `replay_small = 16` as well, against 45.4 with all of them off. +- **Linux: game memory is shared with the graphics card through udmabuf** instead of shadow copies (by Vasilis + Manetas). On a Radeon RX 6800 XT with RADV: 60.7 instead of 40.3 fps in Kokiri Forest, with frames over 25 ms down + from 768 to 5, and 55.7 instead of 42.4 in Hyrule Field. + +## Less memory + +- **Video memory is managed automatically.** A texture the game let go of is dropped after three minutes of play + unused (six for one only the graphics card drew); in the sessions measured nothing came back after that long. + What a switched-off feature held is freed: DLSS and DLAA (81 MiB of images at 2560x1440 and about 0.5 GB per DLSS + feature), FSR, FSR 1 (56 MiB), SMAA (35 MiB), HDR (42 MiB) and frame generation's images; at 4K they are about + twice that. +- **A video memory leak is gone:** each pipeline a run drew kept its fast-linked version as well as its optimised + one. The driver's video memory outside the game's own allocator grew by 491 MiB in one session and from 1,672 to + 2,485 MiB in a long one. +- **Unused pipelines are given back while video memory is short** (`pipe_release`): over 80 % of the card's budget, + the pipelines built ahead of play that no draw has used go, a few hundred every 5 seconds, and a draw that needs one + later builds it again from the pipeline cache. +- **Shader code is kept compressed in system memory while idle** (`shader_compress`): 777 MiB came down to 229 MiB in + a play session, with no decompression on the drawing threads. +- **An area load no longer makes about 1.1 GiB of new upload memory** (by Vasilis Manetas): it reuses what the boot + made. +- **A full video memory heap** sends further allocations to another video memory heap, never to system memory (by + Tobim6). +- **The log has a memory report** every 3,600 frames: video memory by owner, what lies outside the game's allocator, + system memory by owner and what grew over the session. + +## New + +- **F8 saves a bug capture** (by epicmeme546). When you see something wrong, press F8: the game writes where Link + stands, the area, the camera, the picture on screen, your settings, the frame times around the press, the end of + the log and your save into one folder under `logs\captures`, and a note on screen gives the capture its number. + Telling us "capture 3" is then enough: a test run starts at that place with that camera and those settings + (`python tools/capture_run.py 3`, `docs/bug-capture.md`). The flight recorder's F8 dump goes into the capture's + folder. +- **Text speed:** Normal, Fast or Instant. +- **A sprint button** (by kendo): L3 or the game's B button makes Link sprint without rolling first, as a toggle or + while held. +- **Native (100%)** in the Upscaling row, and **frame generation with any Upscaling choice** (DLSS and AMD FSR 3.1). +- **Low latency** in the Screen tab: Off, On or On + Boost, with NVIDIA Reflex or AMD Anti-Lag, without frame + generation too (off by default). +- **Characters' own motion:** every skinned character gives DLSS, FSR 3.1 and frame generation its own motion, and + Link's is on by default, so characters stay sharper while they move. +- **Experimental, off by default:** + - softer shadow edges that crawl less as the camera moves (`shadow_pcf`); + - no one-frame flicker of light or glare when the graphics card falls behind on occlusion counts (`oq_hold`); + - quad and line-loop draws drawn as the game meant them (`quad_index`); + - DLSS or FSR before the bloom; DLSS for every render size of a mode, keeping its history; + - HD rumble for Pro Controllers and Joy-Cons. +- **For reports:** `stutter_map = 1` gives the log a line for each hitch, with the area, what the frame waited for and + any pipeline or shader that was missing, and every 10 minutes a map of the areas by their hitches; + `tools/stutter_map.py` turns a log into a table. The flight recorder also saves after a one-frame flash. + +## Fixed + +- **Crashes and freezes:** + - the log is written before the console, so a blocked console window can no longer stall the game, and closing it + exits the game normally; + - frame generation without an upscaler no longer frees memory the graphics card still uses, and keeps the sizes it + uses when the upscaler's idle sizes are freed; a frame generator that fails is taken down cleanly; + - a texture handle out of range gets a safe empty slot; the menu skips a frame instead of crashing when its buffers + cannot be made; an upload refused for lack of memory is tried again; + - SMAA's images can no longer be freed twice; draw marks are numbered safely across helper threads; + - memory mirrors hand over only after their first copy, under the right lock; + - the render-target heap is sized for the scene, with a safe fallback; + - closing the game during the shader warm-up is no longer counted as a driver crash, and the warm-up is capped at + 10 minutes; + - when two installed drivers list the same graphics card, the newer one is used; + - AMD's Anti-Lag calls are locked against each other; a late HD rumble report no longer starts a Joy-Con pair + buzzing after the stop. +- **Pictures:** height maps, masks and lookup tables appear at once instead of after a placeholder frame; draws that + write memory wait for their pipeline; small buffer clears keep their order; the texture pool has room for the game's + 33,068 descriptors (by Leyukaka); the stand-in upscaler is sharper. +- **Low-end GPU mode** is offered only on the cards it was written for, which ended its shadow bug on high-end cards, + and leaves frames prepared on their own thread off. +- **Radeon RX 5000 and 6000:** mesh pipelines are built without the driver's optimiser, as a candidate fix for the lost + graphics device; the log warns when CPU helper threads are set by number on RX 6000 cards and older. +- **Launcher:** one launcher and one job at a time per install; mod installs are all or nothing and refuse names + Windows cannot keep; an interrupted job is reported at the next start; disk space and long paths are checked before + downloads and unpacks; downloads resume correctly and only into the right file; the settings file is left alone + while the game runs; a save import holds the game's profile lock; crash files are written whole or not at all. + +## Changed + +- **The hidden co-op beta is gone.** The co-op of 0.8.0 (shown only with `coop_beta = 1`) shared story progress + through a relay a player had to run and never showed the other players. Its code, its settings (the `[coop]` + section of nx2navi.ini), its relay script and its menu tab are removed; lines of it left in an nx2navi.ini do + nothing, and a bug report still keeps their values out. A new co-op is being built in its place. +- **The settings menu's Game tab has a Testing heading** with the experimental performance settings: *CPU helper + threads*, *Helpers work ahead*, *Helpers take small jobs* and *Start next frame early*. A row whose setting does + nothing without another one is greyed out and says which it needs. + +## Known issues + +- Enemies above 60 fps were only checked in general; report any that move or attack too fast or too slow. +- The candidate fix for Radeon RX 5000 and 6000 cards losing the graphics device is not confirmed by a player yet. +- *Start next frame early* was measured on an RX 7900 XT only; it is on by default, so please report a dark or + flickering frame on other AMD cards (`tail_early = 0` turns it off). +- The first visit to an area after an install can still pause for a moment while its textures are decoded. +- Integrated AMD GPUs can fail at the title screen (their host memory heap is too small for the game's memory). +- On Linux only the udmabuf change was measured, by its author. + +## Thanks + +Pull requests and branches in this release came from epicmeme546, Tobim6, kendo, automata., Leyukaka and Vasilis +Manetas. Thanks to everyone who sent logs, captures and test reports. diff --git a/docs/releases/v0.9.3.md b/docs/releases/v0.9.3.md deleted file mode 100644 index 018057b3..00000000 --- a/docs/releases/v0.9.3.md +++ /dev/null @@ -1,42 +0,0 @@ -## Faster - -- **Experimental: the next frame no longer waits for the end of the last one's graphics work** (`tail_early = 1` in - nx2navi.ini, off by default; contributed by epicmeme546). The game waits each frame until the graphics card has - finished the frame before. The last of that work is the upscaler (FSR 4, FSR 3.1 or DLSS) and the interface drawn - after it, and nothing the game reads comes out of it. With the setting on, the copies of what the card wrote for the - game go before that last stretch and the game goes on once they are there, so the card finishes the picture while - the next frame is already being prepared. The card runs the same work as before. On an RX 7900 XT with a Ryzen 7 - 5800X3D at 3440x1440, FSR 4 Native AA, Hyrule Field: 50.7 instead of 42.5 fps standing and 56.0 instead of 45.9 along - a route; with `replay_workers = 3` as well, 63.5 instead of 49.4 standing. With FSR 3.1, whose pass is shorter, 51.8 - instead of 47.8 standing. Its pictures matched standing, along the route and through warps to five areas, but it is - new: leave it off to play, and report what you see if you try it. It does nothing without one of those upscalers, - and nothing yet on NVIDIA and Intel cards, where the lazy write-back is on. -- **Experimental: the replay workers take more of a frame off the game's render thread** (`replay_pipe` and - `replay_small` in nx2navi.ini, both 0 by default, both with `replay_workers`; contributed by epicmeme546). With - `replay_pipe = N`, 1 to 4, the thread goes on past up to N groups of draws its workers still record. With - `replay_small = N` as well, a group of N draws or more that is too small to share out goes whole to one worker. On - the same PC standing in Kokiri Forest, with `tail_early = 1`: 60.5 fps with 3 workers alone, 62.2 with 5 workers and - `replay_pipe = 4`, 63.2 with `replay_small = 16` added, against 45.4 with all four settings off. The pictures matched - there and through warps to five areas. - -## New - -- **F8 saves a bug capture.** When you see something wrong, press F8: the game writes where Link stands, the area, - the camera, the picture on screen, your settings, the frame times around the press, the end of the log and your - save into one folder under `logs\captures`, and a note on screen gives the capture its number. Telling us "capture - 3" is then enough: a test run starts at that place with that camera and those settings - (`python tools/capture_run.py 3`, `docs/bug-capture.md`) instead of somewhere else on another save. Until now F8 - did something only with the flight recorder on (`flight = 1`); its F8 dump now goes into the capture's folder. - -## Changed - -- **The draw replay on several CPU cores is off by default again** (`replay_workers = 0`). With three workers on by - default in 0.9.1 and 0.9.2 some players' games ended with a lost graphics device; the cause is not found yet. The - settings menu has it under Game, Testing, as *CPU helper threads (experimental)*: 0 to 8, after a restart. -- **The other experimental performance settings have rows there too**: *Helpers work ahead* (`replay_pipe`, 0 to 4), - *Helpers take small jobs* (`replay_small`, 0 to 64) and *Start next frame early* (`tail_early`). A row whose setting - does nothing without another one is greyed out and says which it needs. -- **The hidden co-op beta is gone.** The co-op of 0.8.0 (shown only with `coop_beta = 1`) shared story progress - through a relay a player had to run and never showed the other players. Its code, its settings (the `[coop]` section - of nx2navi.ini), its relay script and its menu tab are removed; lines of it left in an nx2navi.ini do nothing, and a - bug report still keeps their values out. A new co-op is being built in its place.