燕云十六声 / Where Winds Meet 在 Linux 下启用 DLSS、帧生成和 Reflex 的排障记录
本文记录一次在 Arch Linux + Niri Wayland + NVIDIA Laptop GPU 环境中,让《燕云十六声 / Where Winds Meet》在 Proton/Wine 下显示并启用 DLSS、DLSS Frame Generation 和 Reflex Low Latency 的完整排障过程。
这不是通用补丁包,而是一条可复查的排障路径。不同发行版、Proton 版本、显卡驱动和游戏版本可能需要调整。
最终结果
已确认可用:
- DLSS Super Resolution 选项出现并可使用。
- DLSS Frame Generation 可开启。
- Reflex 降低延迟可开启。
- 调试日志参数已移除,可以正常游玩。
最终稳定配置备份在本机:
/data/Games/yysls-dlss-fg-final-backup-20260626-100824
测试环境
发行版:Arch Linux
桌面环境:Niri 26.04 Wayland
GPU:NVIDIA GeForce RTX 4090 Laptop GPU
驱动:nvidia-open 610.43.02
Wine/Proton runner:proton-cachyos-11.0 via Lutris/umu
游戏 AppID:3564740
Wine prefix:/data/Games/yysls
实际游戏目录:C:\Program Files\yysls\yysls_medium\Engine\Binaries\Win64rh
Streamline 版本:2.11.1
本环境是单 NVIDIA GPU 使用场景,Intel/AMD GPU 被隐藏或禁用。多 GPU 笔记本可能需要额外处理适配器选择。
起始症状
游戏可运行,DX12 也已开启,但图形设置里没有 DLSS 选项。
初期 Streamline 日志显示所有插件都加载失败:
Failed to load plugin '.../Streamline/sl.common.dll' - last error unknown error
Failed to load plugin '.../Streamline/sl.dlss.dll' - last error unknown error
Failed to load plugin '.../Streamline/sl.dlss_g.dll' - last error unknown error
Failed to load plugin '.../Streamline/sl.reflex.dll' - last error unknown error
同时 DXVK-NVAPI 日志能识别显卡:
NvAPI Device: NVIDIA GeForce RTX 4090 Laptop GPU (610.43.2)
<-NvAPI_Initialize: OK
这说明问题不在“完全没有 NVAPI”或“识别不到 NVIDIA GPU”,而在 NVIDIA Streamline 插件加载链路。
最终 Lutris 环境变量
最终保留的 Lutris 配置如下,诊断日志参数已移除:
system:
env:
SteamGameId: "3564740"
SteamAppId: "3564740"
DXVK_ENABLE_NVAPI: "1"
PROTON_ENABLE_NVAPI: "1"
PROTON_HIDE_NVIDIA_GPU: "0"
DXVK_NVAPI_DISABLE_ENTRYPOINTS: "NvAPI_D3D12_SetFlipConfig"
VKD3D_CONFIG: "dxr,dxr11"
DXVK_NVAPI_DRS_NGX_DLSS_SR_OVERRIDE: "on"
DXVK_NVAPI_DRS_NGX_DLSS_RR_OVERRIDE: "on"
DXVK_NVAPI_DRS_NGX_DLSSG_MODE: "auto"
DXVK_NVAPI_DRS_NGX_DLSS_SR_OVERRIDE_RENDER_PRESET_SELECTION: "render_preset_latest"
WINE_HIDE_INTEL_GPU: "1"
WINE_HIDE_AMD_GPU: "1"
VKD3D_VULKAN_DEVICE: "0"
WINEDLLOVERRIDES: "wintrust,crypt32=b;msasn1=n,b;nvapi,nvapi64,nvngx=n"
游戏启动器配置里还需要:
DX12=true
本机路径:
/data/Games/yysls/drive_c/Program Files/yysls/Win32/deploy/setting.ini
Wine DLL override 关键点
最终有效组合是:
wintrust,crypt32=b;msasn1=n,b;nvapi,nvapi64,nvngx=n
含义:
wintrust=b:使用 Wine builtin wintrust。
crypt32=b:使用 Wine builtin crypt32。
msasn1=n,b:优先使用 Windows native msasn1.dll,回退 builtin。
nvapi,nvapi64,nvngx=n:确保使用 native/proxy NVAPI/NGX 路径。
对应注册表中保留了这些全局 override:
[Software\\Wine\\DllOverrides]
"*crypt32"="builtin"
"*msasn1"="native,builtin"
"*wintrust"="builtin"
"crypt32"="builtin"
"msasn1"="native,builtin"
"wintrust"="builtin"
"nvapi"="native"
"nvapi64"="native"
注意:msasn1.dll 来自 Windows 组件。不要把 Windows DLL 放进公开仓库。可以用本机已有的 winetricks 缓存或合法来源提取,并只记录步骤,不分发文件。
排障过程
1. 确认 DX12 与游戏实际运行目录
游戏真正使用的是:
C:\Program Files\yysls\yysls_medium\Engine\Binaries\Win64rh
Streamline 插件目录在:
Win64rh\Streamline
其中存在:
sl.common.dll
sl.dlss.dll
sl.dlss_g.dll
sl.reflex.dll
nvngx_dlss.dll
nvngx_dlssg.dll
setting.ini 中 DX12=true 已确认。
2. 排除 NVAPI 完全不可用
nvapi64.log 显示 DXVK-NVAPI 能正常识别 RTX 4090 Laptop:
DXVK-NVAPI cachyos-11.0-20260429-slr+ NVAPI gcc 14.0.0 x86_64 plain (yysls.exe)
NvAPI Device: NVIDIA GeForce RTX 4090 Laptop GPU (610.43.2)
<-NvAPI_Initialize: OK
所以 DLSS 不出现的第一根因不是 GPU 识别失败。
3. 发现 Streamline 插件安全加载失败
Streamline v2.11.1 会在生产版中通过 security::loadLibrary() 加载插件。
流程简化后是:
if (verifyEmbeddedSignature(path))
{
mod = LoadLibraryW(path);
}
也就是说,插件本身能不能 LoadLibraryW 成功还不够,必须先通过签名验证。
短探针确认:
sl.common.dll、sl.dlss.dll、sl.dlss_g.dll、sl.reflex.dll 可被 LoadLibraryW 加载。
- 导出
slGetPluginFunction 存在。
因此问题集中到签名校验。
4. Wine builtin msasn1 导致 WinVerifyTrust 失败
初始 WinVerifyTrust 探针结果:
WinVerifyTrust(.../sl.*.dll) => 0x80093108
配合 WINEDEBUG=+wintrust,+crypt 可见失败来自 Wine builtin msasn1 的 ASN.1 解析路径。
替换/启用 Windows native msasn1.dll 后,普通签名校验从 0x80093108 前进到其它错误,说明方向正确。
5. 不要用 native wintrust + native crypt32 作为最终方案
曾测试 native wintrust.dll 和 native crypt32.dll,普通签名路径一度可以通过,但 secondary signature 路径不稳定,甚至出现崩溃或 0x80090008。
最终可用组合是:
builtin wintrust + builtin crypt32 + native msasn1
这个组合能让 Streamline 需要的 secondary signature 路径通过。
探针结果:
WinVerifyTrustSecondary(.../sl.common.dll) => 0x00000000 secondary=1 verified=0
完整复刻 Streamline 的 NVIDIA nested signature 校验后也通过:
decode public key => 1 err=0 len=411 expected=411
public key memcmp => match
6. 删除 PROTON_FORCE_NVAPI
曾发现 PROTON_FORCE_NVAPI=1 会触发 runner 的 forcenvapi,导致:
DXVK_NVAPI_ALLOW_OTHER_DRIVERS=1
DXVK_NVAPI_DRIVER_VERSION=99999
日志表现:
DXVK_NVAPI_DRIVER_VERSION is set to '99999', reporting driver version 999.99
这对本机 NVIDIA 单 GPU 环境没有必要,还会污染后续判断。最终删除 PROTON_FORCE_NVAPI,只保留:
DXVK_ENABLE_NVAPI=1
PROTON_ENABLE_NVAPI=1
PROTON_HIDE_NVIDIA_GPU=0
7. 修复后 DLSS 插件加载成功
修复签名链后,Streamline 日志进入正常插件加载阶段:
Loaded plugin 'sl.common'
Loaded plugin 'sl.dlss'
Loaded plugin 'sl.dlss_g'
Loaded plugin 'sl.reflex'
Plugin execution order based on priority:
P0 - sl.common
P100 - sl.dlss
P100 - sl.reflex
P1000 - sl.dlss_g
NGX 也能加载游戏自带 DLL:
Loaded NGXCore from path (.../Streamline/nvngx_dlss.dll)
Loaded NGXCore from path (.../Streamline/nvngx_dlssg.dll)
此时 DLSS 选项开始出现。
帧生成卡死与最终解法
修复 Streamline 后,sl.dlss_g 也能加载,但初次开启帧生成时游戏在加载阶段卡住。
关键 NVAPI 日志:
nvapi_QueryInterface (NvAPI_D3D12_SetFlipConfig): Not implemented method
这说明当前 DXVK-NVAPI 暴露或处理 NvAPI_D3D12_SetFlipConfig 的方式会让 DLSS-G 路径走到不稳定分支。
临时禁用 sl.dlss_g.dll 后,DLSS-SR 可稳定出现并可玩,说明问题只集中在 Frame Generation 插件。
最终可用方案不是禁用 sl.dlss_g,而是:
DXVK_NVAPI_DISABLE_ENTRYPOINTS: "NvAPI_D3D12_SetFlipConfig"
DXVK_NVAPI_DRS_NGX_DLSSG_MODE: "auto"
并且不要恢复强制 FG override:
# 不要设置这个
DXVK_NVAPI_DRS_NGX_DLSS_FG_OVERRIDE: "on"
这样 sl.dlss_g 能加载,Frame Generation 能开启,同时绕开卡住的 SetFlipConfig 入口。
最终确认:
- DLSS 超分出现。
- Frame Generation 可开启。
- Reflex Low Latency 可开启。
为什么不建议走 Wine win32u 补丁路线
中途曾尝试追 Wine/Proton 的 win32u.so D3DKMT 补丁方向,结果:
- 11.11 ABI 不兼容,容易崩溃。
- 11.0 二进制替换有 OOM 和整机卡死风险。
- ProtonDB/GamingOnLinux 公开信息没有显示该游戏必须靠 D3DKMT type 15 补丁才能 DLSS。
最终证明问题主线在 Streamline 签名校验和 DLSS-G 的 NVAPI entrypoint,而不是 win32u.so。
最小复现/验证思路
如果要在其他机器上验证,建议按这个顺序:
- 确认 DX12 开启。
- 确认
DXVK-NVAPI 能识别 NVIDIA GPU。
- 开启临时 Streamline 日志:
SL_LOG_LEVEL: "2"
SL_LOG_PATH: "C:\\users\\<user>\\AppData\\Local\\Temp"
SL_LOG_NAME: "yysls-streamline.log"
- 如果看到所有
sl.*.dll 都 Failed to load plugin,优先查签名校验。
- 如果
sl.dlss 成功但 sl.dlss_g 卡住,查 NvAPI_D3D12_SetFlipConfig。
- 验证完后删除日志参数,避免日志长期增长。
临时 NVAPI 日志参数:
DXVK_NVAPI_LOG_LEVEL: "info"
DXVK_NVAPI_LOG_PATH: "C:\\users\\<user>\\AppData\\Local\\Temp"
验证完也应删除。
最终清理后的运行配置
最终运行时不保留诊断日志参数。完整配置如下:
game:
exe: /home/lingxi/Games/yysls/drive_c/Program Files/yysls/Win32/deploy/launcher.exe
prefix: /home/lingxi/Games/yysls
working_dir: /home/lingxi/Games/yysls/drive_c/Program Files/yysls/Win32/deploy
wine:
version: proton-cachyos-11.0
show_debug: "-all"
system:
env:
SteamGameId: "3564740"
SteamAppId: "3564740"
DXVK_ENABLE_NVAPI: "1"
PROTON_ENABLE_NVAPI: "1"
PROTON_HIDE_NVIDIA_GPU: "0"
DXVK_NVAPI_DISABLE_ENTRYPOINTS: "NvAPI_D3D12_SetFlipConfig"
VKD3D_CONFIG: "dxr,dxr11"
DXVK_NVAPI_DRS_NGX_DLSS_SR_OVERRIDE: "on"
DXVK_NVAPI_DRS_NGX_DLSS_RR_OVERRIDE: "on"
DXVK_NVAPI_DRS_NGX_DLSSG_MODE: "auto"
DXVK_NVAPI_DRS_NGX_DLSS_SR_OVERRIDE_RENDER_PRESET_SELECTION: "render_preset_latest"
WINE_HIDE_INTEL_GPU: "1"
WINE_HIDE_AMD_GPU: "1"
VKD3D_VULKAN_DEVICE: "0"
WINEDLLOVERRIDES: "wintrust,crypt32=b;msasn1=n,b;nvapi,nvapi64,nvngx=n"
回退方案
如果 Frame Generation 又导致卡死,但 DLSS-SR 要保留,可以临时禁用 DLSS-G 插件:
WINEDLLOVERRIDES: "sl.dlss_g=d;wintrust,crypt32=b;msasn1=n,b;nvapi,nvapi64,nvngx=n"
这会保留 DLSS 超分,关闭 Frame Generation。
本机有一个 DLSS-SR 稳定态备份:
/data/Games/yysls-dlss-fg-final-backup-20260626-100824/opencode-artifacts/yysls-dlss-working-20260626-095828
不建议做的事
- 不要长期保留
SL_LOG_*、DXVK_NVAPI_LOG_*、WINEDEBUG=+... 这类日志参数。
- 不要启用
PROTON_FORCE_NVAPI=1,它会触发 driver spoof 到 999.99。
- 不要直接替换 runner 的
win32u.so,除非明确知道 ABI 与 runner 完全匹配。
- 不要把 native
wintrust.dll + native crypt32.dll 当作最终方案,本次测试 secondary signature 路径不稳定。
- 不要把 Windows DLL 上传到 GitHub 仓库。
一句话总结
这次 DLSS 不出现的核心原因是 Streamline 插件安全加载被 Wine 的签名校验链卡住。用 builtin wintrust/crypt32 加 native msasn1 后,sl.dlss、sl.dlss_g、sl.reflex 能正常加载。Frame Generation 的加载卡死来自 NvAPI_D3D12_SetFlipConfig 路径,隐藏该 entrypoint 并让 DLSSG 走 auto 后,DLSS、帧生成和 Reflex 都可用。