mirror of
https://github.com/tangerineturtle1/NX2navi.git
synced 2026-11-15 17:09:57 -04:00
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 <noreply@anthropic.com>
This commit is contained in:
165
docs/releases/v0.10.0.md
Normal file
165
docs/releases/v0.10.0.md
Normal file
@@ -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.
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user