
W3LoadFix - 更快的加载时间
修复了死亡后加载缓慢、快速加载和快速旅行的问题。在我的测试中,引擎的加载阶段耗时减少了约70%。所有操作都在内存中进行,不修改任何游戏文件。
查看大图[size=5][b][color=#e0a940]功能说明[/color][/b][/size]
在《巫师 3 重制版》中,死亡后重新加载、快速加载或快速旅行在我的电脑上需要 20 多秒,而 CPU 大多处于空闲状态。加载画面把这段时间花在了几个在单线程上运行并等待自身的引擎例程上。本模组在内存中修复了这些问题。不修改任何游戏文件、脚本或资源包。
我的测试电脑:i5-12600K、RTX 5080、NVMe SSD。在威伦死亡后重新加载,引擎加载阶段:[b]22.4 秒 → 4.7 秒[/b](6 次重新加载的中位数,所有选项关闭对比全部开启)。
这些数字来自我在这一台电脑上的测试,因此你的结果会不同,取决于你的 CPU、硬盘以及加载地点。每次加载后,[i]w3loadfix.log[/i] 都会有一行 [i]LOAD DONE[/i] 并附带总耗时,因此你可以自行测量。
[b]1.0.8 新增内容:[/b]更快的解压和更快的植被加载现在仅在加载画面期间生效。游戏进行时,游戏会像没有模组时一样解压数据。加载时间与 1.0.7 相同。新增开关“实验性:游戏内更快的流式加载”(默认关闭),为需要的人恢复 1.0.7 的行为。完整变更列表见“更新日志”标签页。
[line]
[size=5][b][color=#e0a940]选项与节省的时间[/color][/b][/size]
除实验性开关外,所有选项默认开启,每个选项在 [i]选项 → 模组 → W3LoadFix[/i] 中都有自己的开关。所有选项仅在加载画面期间生效,因此游戏进行时游戏会像没有模组时一样运行。唯一的例外是实验性开关,它默认关闭。
[list]
[][b]更快的室内区域[/b](约 2.6 秒)- 在室内区域组件扫描期间,保留光照探针的索引,这样每个室内区域组件运行一次的光照探针搜索就不必每次都扫描整个世界列表。[/]
[][b]从头启用引擎加载模式[/b](约 2.2 秒)- 在整个加载画面期间开启该模式,使加载器立即重新检查文件,而不是休眠 1 毫秒。游戏只在接近结束时才启用它。[/]
[][b]快速并行解压[/b](约 1.1 秒)- 使用 [url=https://github.com/ebiggers/libdeflate]libdeflate[/url] 解压游戏数据,大块数据拆分到多个 CPU 核心上。对于不确定的块,交回游戏自带的 zlib 处理。[/]
[][b]在更多线程上解压[/b](约 0.7 秒)- 游戏在单个线程上解压数据。W3LoadFix 将该工作交给自己最多 3 个线程(物理核心数 - 1,最多 3 个),因此可并行运行。[/]
[][b]更快的标签管理器[/b](约 0.7 秒)- 为每个标签列表保留索引,结果与顺序与游戏相同。[/]
[][b]更快的植被加载[/b](约 0.2 秒)- 游戏为每个植被实例(树木、草)读取数组时使用六次小读取。W3LoadFix 一次性复制每个数组,字节完全相同。[/]
[][b]地形瓦片预取[/b](在我的 NVMe SSD 上没有可测量的收益)- 一次性请求所有地形和遮挡瓦片,而不是逐个请求且每次之后等待 1 毫秒。在引擎加载模式开启时,快速硬盘上的等待已经消失;批量请求在较慢的硬盘上可能仍有帮助(未测量)。[/]
[][b]加载时减少控制器检查(Linux)[/b](仅限 Linux / Steam Deck)- 在 Proton 下,游戏每个加载画面会检查控制器数十万次,在某些 Proton 版本上每次检查都很慢,尤其是连接了游戏手柄时。W3LoadFix 在加载期间自行应答其中大部分检查,且仅在它们很慢时。在 Windows 上或游戏进行时没有任何变化。[/]
[][b]实验性:游戏内更快的流式加载[/b](默认关闭)- 使快速并行解压、在更多线程上解压和更快的植被加载在游戏进行时也生效,如同 1.0.7 中那样,适用于你在世界中移动时游戏流式加载的所有内容。加载画面不会更快,我也没有测量到游玩时的任何效果。它默认关闭,因此游戏进行时游戏会自行流式加载数据。如果你在开启时注意到游玩中有问题,请将其关闭。[/]
[][b]加载画面淡入淡出[/b] - 三个滑块。游戏默认为 3 / 3 / 1.5 秒(共 7.5 秒);我使用 1 / 1 / 0.5 秒(共 2.5 秒)。它们只缩短淡入淡出,而不缩短加载本身。[/]
[/list]节省的时间是指仅关闭该选项而其他所有选项保持开启时,重新加载变慢了多少,使用模组的基准测试模式测量(相同存档,每次 6 次重新加载的中位数)。这些选项相互重叠,因此这些数字不会加总为总节省时间。
[line]
[size=5][b][color=#e0a940]安装[/color][/b][/size]
手动安装:将压缩包内容复制到游戏文件夹(包含 [i]bin[/i] 和 [i]content[/i] 的那个文件夹)。有用户报告 Mod Manager Redux 也可用;我没有测试 Vortex。[i]dsound.dll[/i] 是模组的加载器。游戏在启动时加载它,它再加载 w3loadfix.dll(它还会将声音调用转发给真正的 Windows 库)。你不需要运行任何其他程序。
[code]bin\x64_dx12\dsound.dll 加载器:加载 w3loadfix.dll,将声音调用转发给 Windows
bin\x64_dx12\w3loadfix.dll 模组本体
bin\x64_dx12\w3loadfix.ini 设置
bin\config\r4game\user_config_matrix\pc\w3loadfix.xml 选项菜单条目[/code]从 1.0.0 升级:加载器以前是 [i]bin\x64_dx12\xinput9_1_0.dll[/i]。如果是随 W3LoadFix 一起安装的,请删除它;如果它被另一个模组的 [i]xinput9_1_0.dll[/i] 替换了,请保留那个。
[line]
[size=5][b][color=#e0a940]设置[/color][/b][/size]
[list]
[][i]选项 → 模组 → W3LoadFix[/i] 有一个主开关 [b]W3LoadFix enabled[/b](无需卸载即可关闭整个模组)、每个选项的开关以及三个淡入淡出滑块。更改从下次加载起生效。[/]
[]可选文件 [b]Separate menu[/b]:将其覆盖安装到主文件上,可将该部分移回 [i]选项 → W3LoadFix[/i]。如果“模组”页面无法打开,请使用它,因为在“模组”菜单中有许多模组时,游戏(5.x)可能显示空白模组页面并锁定菜单。重新安装主文件可返回 [i]选项 → 模组[/i]。[/]
[]菜单文本跟随游戏的文本语言(内置英语、意大利语、德语、法语、西班牙语和波兰语;其他语言使用英语,除非你添加翻译文件:见“翻译”)。[/]
[]开关保存在 [i]bin\x64_dx12\w3loadfix.ini[/i]([W3LoadFix] 节)中,模组读取的就是它。在菜单中更改开关会更新该 ini;编辑 ini 会在几秒内生效,菜单将在下次游戏启动时显示新值。[/]
[/list][line]
[size=5][b][color=#e0a940]翻译[/color][/b][/size]
选项菜单内置英语、意大利语、德语、法语、西班牙语和波兰语,跟随游戏的文本语言。对于任何其他语言,你可以添加翻译文件,无需修改 DLL。
[list=1]
[]下载可选文件 [b]Translation Template[/b]。它包含英文文本和说明。[/]
[]将 [i]w3loadfix_template.ini[/i] 放入 [i]bin\x64_dx12[/i](与 w3loadfix.dll 同目录),并用游戏的语言代码重命名,例如 [i]w3loadfix_UA.ini[/i] 或 [i]w3loadfix_JP.ini[/i]。[/]
[]翻译“=”之后的文本,并将文件保存为 UTF-8。[/]
[/list]当你更改游戏的文本语言时,菜单会切换语言。[i]w3loadfix.log[/i] 会说明找到了多少条目以及缺少哪些。没有翻译文件时,不会有任何变化。
欢迎提供翻译:你可以仅凭你的语言文件在 Nexus 上作为独立翻译模组发布(会链接到此页面),或发送给我,我会添加并注明出处。
[line]
[size=5][b][color=#e0a940]Linux / Steam Deck:加载期间的控制器检查[/color][/b][/size]
在 Windows 上,游戏使用 GameInput 读取控制器。在 Proton 下缺少 GameInput,因此在加载画面期间游戏在主线程上以紧密循环向 XInput 询问控制器状态,在我的测试中每次加载 333,000 到 573,000 次(Windows,阻止 GameInput 以模拟 Proton 行为)。在某些 Proton 版本上每次检查都很慢,因此主线程在整个加载画面期间都在等待控制器。
[code]一次控制器检查的开销(XInputGetState)
无控制器 已连接控制器 拔掉控制器后
Windows 11 13-64 微秒 (游戏不使用:它使用 GameInput)
Valve Proton 10.0-4b 0.03 微秒 8 微秒 0.03 微秒
GE-Proton 11-7 36 微秒 1,202 微秒 316 微秒
模拟加载画面:留给加载工作的时间,不使用 -> 使用 W3LoadFix 1.0.4
无控制器 已连接控制器 拔掉控制器后
Valve Proton 10.0-4b 95% -> 95% 25% -> 94% 96% -> 95%
GE-Proton 11-7 6% -> 96% 0% -> 93% 1% -> 95%[/code]第一张表是一次检查的开销,使用小型测试程序在每个 Proton 下测量(在 Linux 容器中,使用虚拟 Xbox 360 控制器)。第二张是模拟加载画面,每轮有 4 次控制器检查和 10 微秒的加载工作,以及留给工作的时间比例。这些是测试台数字,不是 Linux 上的游戏计时。使用 Proton-CachyOS 和 Proton-Wineland 并连接游戏手柄的用户报告,使用 1.0.4 时加载约 4-5 秒。如果你在 Linux 上玩,w3loadfix.log 的 XInput 行会显示你的系统上发生了什么。
[line]
[size=5][b][color=#e0a940]要求[/color][/b][/size]
[list]
[]《巫师 3:狂猎》[b]重制版[/b],[b]版本 5.01[/b](主菜单标志下方的数字),[b]DX12[/b] 可执行文件。在 Steam 版本上测试;有用户报告 GOG 版本 5.01 也可用。其他版本未测试:模组只启用它识别出其代码的功能。[/]
[]Windows 64 位(在 Windows 11 上测试)和 64 位 CPU,或 Linux / Steam Deck 配合 Proton(见“兼容性”)。[/]
[/list][line]
[size=5][b][color=#e0a940]游戏更新[/color][/b][/size]
模组通过签名而非仅依赖固定地址来查找所需的游戏代码。游戏补丁后,每个选项仅在其代码仍被识别时保持开启,否则会自动关闭。[i]w3loadfix.log[/i] 列出了哪些选项处于活动状态。
[line]
[size=5][b][color=#e0a940]兼容性[/color][/b][/size]
[list]
[]加载器是 [i]dsound.dll[/i],因此 W3LoadFix 可以与自带 [i]xinput9_1_0.dll[/i] 的模组一起安装(例如 Path Tracing and Ray Tracing Optimization)。[/]
[]只能存在一个名为 [i]dsound.dll[/i] 的文件,因此如果另一个模组(或 Ultimate ASI Loader)使用该名称,请只安装其中一个。[/]
[]Linux / Steam Deck(Proton):相同的文件可用,但除非另有指示,Proton 会使用自己的 [i]dsound.dll[/i]。将以下内容添加到游戏的 Steam 启动选项中:
[code]WINEDLLOVERRIDES="dsound=n,b" %command%[/code]如果另一个模组已经需要覆盖(OptiScaler:dxgi),请列出两个名称:
[code]WINEDLLOVERRIDES="dsound,dxgi=n,b" %command%[/code][/]
[]已经有 [i]dsound.dll[/i]、ASI 加载器或在 [i]bin\x64_dx12[/i] 中使用 DLL 的其他模组?请使用下面的步骤。[/]
[]在 Linux / Proton 上使用 ASI 加载器时,启动选项需要加载器自己的名称,例如 [i]WINEDLLOVERRIDES="dinput8=n,b" %command%[/i](或你给它的名称),而不是 [i]dsound[/i]。[/]
[]我没有与许多其他模组一起测试过。[/]
[/list][line]
[size=5][b][color=#e0a940]使用 ASI 加载器代替 dsound.dll[/color][/b][/size]
如果另一个模组已经使用 [i]dsound.dll[/i](或者你不想改动你的 DLL),W3LoadFix 可以由 ASI 加载器加载,而不是它自己的 [i]dsound.dll[/i]。
[list=1]
[]先备份 [i]bin\x64_dx12[/i],并且不要覆盖你已有的任何 DLL。[/]
[]检查你是否已有 ASI 加载器:在 [i]bin\x64_dx12[/i] 及其 [i]scripts[/i]、[i]plugins[/i] 和 [i]update[/i] 文件夹中查找 [i].asi[/i] 文件,或右键单击你的 [i]dinput8.dll[/i] > 属性 > 详细信息:如果是,会显示“Ultimate ASI Loader”。如果你已有,请跳过第 3 步。[/]
[]还没有 ASI 加载器:获取 [url=https://github.com/ThirteenAG/Ultimate-ASI-Loader/releases]Ultimate ASI Loader[/url](x64 zip),解压,将其 [i]dinput8.dll[/i] 重命名为 [i]winmm.dll[/i](这样不会覆盖你自己的 [i]dinput8.dll[/i];仅当你没有 [i]winmm.dll[/i] 时)并复制到 [i]bin\x64_dx12[/i]。[/]
[]不要安装 W3LoadFix 的 [i]dsound.dll[/i]。将 [i]w3loadfix.dll[/i] 重命名为 [i]w3loadfix.asi[/i] 并放入 [i]bin\x64_dx12[/i],与 [i]witcher3.exe[/i] 同目录。如果误安装了 [i]dsound.dll[/i] 和 [i].asi[/i] 两者,只会运行一个副本。[/]
[]启动游戏:[i]w3loadfix.log[/i] 应有一行 [i]=== W3LoadFix <version> ACTIVE ===[/i]。如果没有,请发布日志。[/]
[/list]已使用重命名为 [i]winmm.dll[/i] 的 Ultimate ASI Loader 9.7.4 测试。
[line]
[size=5][b][color=#e0a940]已知问题[/color][/b][/size]
[list]
[]在一台电脑上使用重制版 5.01 DX12 版本开发和测试。原版次世代版本和 DX11 可执行文件未测试。[/]
[]淡入淡出滑块是游戏设置,即使没有模组也会保留你设置的最后值。如果你想要原始的淡入淡出,请将它们设回 3 / 3 / 1.5。[/]
[]在 Linux / Steam Deck(Proton)上,完全没有 [i]w3loadfix.log[/i] 意味着缺少启动选项(见“兼容性”)。如果使用 PROTON_NO_FSYNC / PROTON_NO_ESYNC 关闭 fsync 和 esync,加载会慢得多;日志的 [i]Proton[/i] 行会显示同步模式。[/]
[]自 1.0.4 起已处理 Linux 上连接游戏手柄时的慢加载。来自[url=https://www.reddit.com/r/linux_gaming/comments/1wxtzri/witcher_3_remastered_save_loads_taking_60_seconds/]这篇 Reddit 帖子[/url]的 xinput DLL 变通方法(一些用户以前需要)根据尝试过 1.0.4 的用户反馈已不再必要。如果加载存档仍然比几秒长得多,请把日志发给我。[/]
[/list]如果加载时看起来有问题,请先关闭 [i]Faster tag manager[/i]、[i]Decompression on more threads[/i] 和 [i]Fast parallel decompression[/i],然后关闭其他选项,并告诉我哪一个解决了问题。请附上 [i]bin\x64_dx12\w3loadfix.log[/i](它不含个人数据)。
[line]
[size=5][b][color=#e0a940]致谢[/color][/b][/size]
[list]
[][url=https://github.com/TsudaKageyu/minhook]MinHook[/url],作者 Tsuda Kageyu(BSD 2-clause),含 Vyacheslav Patkov 的 Hacker Disassembler Engine 64(BSD)[/]
[][url=https://github.com/ebiggers/libdeflate]libdeflate[/url],作者 Eric Biggers 及贡献者(MIT)[/]
[]CD PROJEKT RED 提供的 REDkit,使命名引擎函数成为可能[/]
[]感谢所有测试和报告的人[/*]
[/list]许可证文本在 [i]W3LoadFix_licenses[/i] 中。模组作者 WildHeathen。
[i]粉丝自制模组,与 CD PROJEKT RED 无关联,也未获其认可。The Witcher 是 CD PROJEKT S.A. 的商标。[/i]
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。