diff --git a/docs/releases/v0.9.3.md b/docs/releases/v0.9.3.md index 2eb81315..88496e36 100644 --- a/docs/releases/v0.9.3.md +++ b/docs/releases/v0.9.3.md @@ -23,7 +23,7 @@ - **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 *Replay workers (experimental)*: 0 to 8, after a restart. -- **The other experimental performance settings have rows there too**: *Worker groups in flight* (`replay_pipe`), - *Small groups to one worker* (`replay_small`) and *Early frame end* (`tail_early`). A row whose setting does nothing - without another one is greyed out and says which it needs. + 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**, each a switch: *Helpers work ahead* (on is + `replay_pipe = 4`), *Helpers take small jobs* (on is `replay_small = 16`) and *Start next frame early* + (`tail_early`). A row whose setting does nothing without another one is greyed out and says which it needs. diff --git a/nx2navi.ini.example b/nx2navi.ini.example index ca84c394..db63418c 100644 --- a/nx2navi.ini.example +++ b/nx2navi.ini.example @@ -69,7 +69,7 @@ # EXPERIMENTAL. Record the large groups of draws of a submission on this many replay worker threads beside the # submitting one, 0 to 16. Default: 0, the replay records everything on one thread. 3 gave 51.7 instead of 43.6 fps # standing in Hyrule Field on an RX 7900 XT, and more than 3 gave nothing more; some players' games ended with a lost -# graphics device with it on, so it is off unless you turn it on (also in the menu: Game, Testing, Replay workers). +# graphics device with it on, so it is off unless you turn it on (also in the menu: Game, Testing, CPU helper threads). # With 1 a worker records each long run of draws while the submitting thread waits for it: no faster, it checks that # the pictures stay the same. # replay_workers = 0 @@ -79,13 +79,14 @@ # results it reads are there. A frame whose end hands the game anything else runs as before. Default: 0. Standing in # Hyrule Field on an RX 7900 XT with FSR 4: 50.7 instead of 42.5 fps, and 63.5 instead of 49.4 with replay_workers = 3. # Does nothing without one of those upscalers, nor with the lazy write-back (the default on NVIDIA and Intel cards). -# Also in the menu: Game, Testing, Early frame end. +# Also in the menu: Game, Testing, Start next frame early. # tail_early = 0 # EXPERIMENTAL, with replay_workers. replay_pipe = N (1 to 4, default 0): the submitting thread goes on past up to N # groups its workers still record. replay_small = N (default 0, needs replay_pipe): a group of N draws or more that is # too small to share out goes whole to one worker. Kokiri Forest standing on an RX 7900 XT with FSR 4, tail_early = 1, # replay_workers = 5, replay_pipe = 4 and replay_small = 16: 63 instead of 45 fps with all of them off. Also in the -# menu: Game, Testing, Worker groups in flight and Small groups to one worker. +# menu: Game, Testing, as switches: Helpers work ahead (on is replay_pipe = 4) and Helpers take small jobs (on is +# replay_small = 16). # replay_pipe = 0 # replay_small = 0 # EXPERIMENTAL, THE GAME CRASHES WITH 1. 1 lifts the virtual core gate: guest threads run without the console's limit diff --git a/runtime/ui/menu.cpp b/runtime/ui/menu.cpp index cfeddcd8..cb092290 100644 --- a/runtime/ui/menu.cpp +++ b/runtime/ui/menu.cpp @@ -1413,13 +1413,15 @@ static void tab_game(float scale) { // Testing: experimental rows, then the debug menu where the game version has it opt_group_text("Testing"); // vk_exec.c rw_init and tail_enabled read these at start: each row notes the restart and the bar's Restart does - // it. A row whose setting does nothing without another one (rw_init) is greyed out until that one is set. + // it. A row whose setting does nothing without another one (rw_init) is greyed out until that one is set. The two + // rows under the workers are switches: on writes the value measured best (4 groups at once, groups from 16 draws), + // and any other value set in nx2navi.ini shows as on and stays. opt_slider("NX2NAVI_REPLAY_WORKERS", UI_MENU_REPLAY_WORKERS, 0, 8, UI_MENU_REPLAY_WORKERS_DESC, 1, "%.0f"); const bool workers = cfg_int("NX2NAVI_REPLAY_WORKERS") > 0, pipe = workers && cfg_int("NX2NAVI_REPLAY_PIPE") > 0; if (!workers) opt_disable_next(UI_MENU_NEEDS_WORKERS); - opt_slider("NX2NAVI_REPLAY_PIPE", UI_MENU_REPLAY_PIPE, 0, 4, UI_MENU_REPLAY_PIPE_DESC, 1, "%.0f"); + opt_toggle_value("NX2NAVI_REPLAY_PIPE", UI_MENU_REPLAY_PIPE, UI_MENU_REPLAY_PIPE_DESC, "4", "0"); if (!pipe) opt_disable_next(workers ? UI_MENU_NEEDS_PIPE : UI_MENU_NEEDS_WORKERS); - opt_slider("NX2NAVI_REPLAY_SMALL", UI_MENU_REPLAY_SMALL, 0, 64, UI_MENU_REPLAY_SMALL_DESC, 4, "%.0f"); + opt_toggle_value("NX2NAVI_REPLAY_SMALL", UI_MENU_REPLAY_SMALL, UI_MENU_REPLAY_SMALL_DESC, "16", "0"); opt_toggle("NX2NAVI_TAIL_EARLY", UI_MENU_TAIL_EARLY, UI_MENU_TAIL_EARLY_DESC); // The debug menu, a tool for testing with English text of its own: off unless switched on here if (dbg_supported()) { diff --git a/runtime/ui_text.c b/runtime/ui_text.c index 44279421..2bd703b6 100644 --- a/runtime/ui_text.c +++ b/runtime/ui_text.c @@ -470,27 +470,23 @@ static const char *const text_en[UI_TEXT_COUNT] = { "where the card has none, keeps video memory within what the driver reports free, waits less for the GPU and " "prepares frames on a thread of their own. Measured on a Radeon RX 580 only: it can show a dark or flickering " "frame now and then, so leave it off on a newer card.", - [UI_MENU_REPLAY_WORKERS] = "Replay workers (experimental)", - [UI_MENU_REPLAY_WORKERS_DESC] = "CPU threads that help translate each frame's draws for the GPU, beside the game's own " - "thread. 3 gave about 20% more frames a second in Hyrule Field on an 8-core CPU; more " - "than 3 gave little more. Some players' games crashed with them on: 0 (off) is the " - "safe choice.", - [UI_MENU_REPLAY_PIPE] = "Worker groups in flight (experimental)", - [UI_MENU_REPLAY_PIPE_DESC] = "How many groups of draws the replay workers may have in hand at once while the game's " - "render thread goes on to the draws after them. At 0 the thread waits for each group " - "and helps with it. 2 to 4 gave 1 to 2% more frames a second with 5 workers and the " - "early frame end on, and nothing without it.", - [UI_MENU_REPLAY_SMALL] = "Small groups to one worker (experimental)", - [UI_MENU_REPLAY_SMALL_DESC] = "A group of at least this many draws that is too small to split between workers goes " - "whole to one worker, and the game's render thread goes on. 0 is off: the thread " - "records such groups itself. 16 gave about 2% more frames a second in Kokiri Forest.", - [UI_MENU_TAIL_EARLY] = "Early frame end (experimental)", - [UI_MENU_TAIL_EARLY_DESC] = "Lets the game start its next frame while the GPU still runs the upscaler and the rest " - "of the frame's end. With FSR 4 on a Radeon RX 7900 XT it gave 19 to 29% more frames a " - "second in Hyrule Field, measured on that card only and not in long sessions. It needs " - "TAA, or DLSS, FSR 3.1 or FSR 4 under Upscaling, and for now an AMD card: without " - "them the game runs as before.", - [UI_MENU_NEEDS_WORKERS] = "needs replay workers", [UI_MENU_NEEDS_PIPE] = "needs worker groups in flight", + [UI_MENU_REPLAY_WORKERS] = "CPU helper threads (experimental)", + [UI_MENU_REPLAY_WORKERS_DESC] = "Uses more of your CPU's cores to prepare each frame for the graphics card. 0 turns it " + "off. 3 gave about 20% more frames a second on an 8-core CPU, and 5 a little more " + "with the settings below. Some players' games crashed with this on: set it back to " + "0 if yours does.", + [UI_MENU_REPLAY_PIPE] = "Helpers work ahead (experimental)", + [UI_MENU_REPLAY_PIPE_DESC] = "The game carries on with the rest of the frame while the helper threads are still " + "busy, instead of waiting for them. A small gain: 1 to 2% more frames a second.", + [UI_MENU_REPLAY_SMALL] = "Helpers take small jobs (experimental)", + [UI_MENU_REPLAY_SMALL_DESC] = "Gives the helper threads the smaller batches of drawing work too, not only the large " + "ones. A small gain: about 2% more frames a second.", + [UI_MENU_TAIL_EARLY] = "Start next frame early (experimental)", + [UI_MENU_TAIL_EARLY_DESC] = "The game starts on its next frame while the graphics card is still finishing the " + "current one. The biggest gain of these settings: 19 to 29% more frames a second with " + "FSR 4 on a Radeon RX 7900 XT, the only card it was measured on. It needs TAA, DLSS, " + "FSR 3.1 or FSR 4, and for now an AMD graphics card. Without them it changes nothing.", + [UI_MENU_NEEDS_WORKERS] = "needs CPU helper threads", [UI_MENU_NEEDS_PIPE] = "needs Helpers work ahead", [UI_MENU_DISCORD_RPC] = "Discord Rich Presence", [UI_MENU_DISCORD_RPC_DESC] = "Shows \"Playing NX2navi\" with the play time in your Discord status while the " "game runs. discord_app_id and discord_image in nx2navi.ini choose the application.", diff --git a/runtime/vk_exec.c b/runtime/vk_exec.c index 04f772df..7b5ce354 100644 --- a/runtime/vk_exec.c +++ b/runtime/vk_exec.c @@ -1836,7 +1836,7 @@ static void op_one(VkExec *ex, const op_hdr *h) { } // ---- replay workers (NX2NAVI_REPLAY_WORKERS, default 0: the replay records every op on the submitting thread; the -// Game tab's Replay workers row sets it) +// Game tab's CPU helper threads row sets it) // 3 workers: on an RX 7900 XT with a Ryzen 7 5800X3D, Hyrule Field standing went from 41.2 to 50.4 fps (2026-11-12, one // batch), with the same pictures there and in Kokiri Forest, Kakariko, Goron City, a graveyard house and Gerudo // Valley; 5 or 7 workers measured the same as 3. Default 0 again after players' games crashed with 3 on by default