8.3 KiB
终末地(Arknights: Endfield)· DLSS 5 神经渲染 完整配方
2026-09-18 实测跑通。本文记录可复现的最小配置与每一条失败路径的实证原因, 避免以后再走一遍弯路。
一、最终可用配置
形态:单 DLL 外部注入。 游戏目录里零外来文件。
注入(只进 Endfield.exe,不进其它进程):
H:\endfield-dlss5\winmm.dll OptiScaler-DLSSNR v0.2.0(改名为 winmm.dll)
├── H:\endfield-dlss5\OptiScaler\ 后端 DLL(FidelityFX / XeSS 等)
├── H:\endfield-dlss5\nvngx.dll_dlssnr.dll 神经转发器(包内自带)
└── H:\endfield-dlss5\nvngx_dlssnr.dll 神经模型本体 310.8.0.0(需自备,165 MB)
游戏目录: 只保留游戏自带文件(含它自己的 nvngx_dlss.dll 310.5.2.0,未改动)
启动参数: -force-d3d11 -launcher_lang=zh-cn -launcher_sub_channel=1
关键 ini 设置(H:\endfield-dlss5\OptiScaler.ini)
| 段 | 键 | 值 | 为什么 |
|---|---|---|---|
[Upscalers] |
Dx11Upscaler |
dlss_12 |
ini 注释原文:dlss_12 (dx11on12, **the only option that can run DLSS Neural Rendering as well**) —— D3D11 上唯一能跑神经渲染的选项 |
[DlssNr] |
Enabled |
true |
默认关 |
[Menu] |
ShortcutKey |
0x24(Home) |
默认 0x2D(Insert),很多键盘没有 Insert |
[DlssNr] |
WhitePointScale |
1.0 |
默认 auto 会逐帧测量,导致亮度泵动(见「已知问题」) |
[ProcessFilter] |
TargetProcessName |
endfield.exe |
双保险;ini 自带的示例就是终末地 |
[ProcessFilter] |
ProcessExclusionList |
PlatformProcess.exe|QtWebEngineProcess.exe|ACE-Setup64.exe|ACE-Service64.exe|CefViewWing.exe|UnityCrashHandler64.exe |
同上 |
启动方式:桌面 终末地-DLSS5启动.bat → H:\endfield-dlss5\launch.ps1 → injector.exe
二、为什么必须是「外部注入 + 单 DLL」
2.1 目录代理 DLL 会被同目录所有进程吞掉(ACE 拦的根因)
终末地在同一目录派生:PlatformProcess.exe、QtWebEngineProcess.exe、CefViewWing.exe、
ACE-Setup64.exe、ACE-Service64.exe、UnityCrashHandler64.exe。
放在游戏目录的代理 DLL 会被它们 LoadLibrary 动态加载(应用目录优先),
于是 ReShade/feeder 跑进了鹰角的辅助进程 —— 实测铁证:
dlss5-feed.log 21:18:08.600 host: H:\Arknights Endfield\PlatformProcess.exe ← 不是 Endfield.exe
后果:ACE 报「检测到黑客工具」。 (另见 optiscaler/OptiScaler issue #848,报的就是终末地这个游戏。)
OptiScaler 的 TargetProcessName/ProcessExclusionList 挡不住这件事 ——
它们只阻止 OptiScaler 初始化,阻止不了 DLL 被加载进那些进程。
2.2 社区的做法是「只注入目标进程」
XXMI(终末地社区实际在用的 mod 加载器)用 SetWindowsHookEx,
在目标进程创建第一个窗口时把 DLL 送进去,钩子在 finally 里必定移除;
其文档明确说这样「更少直接内存操作、潜在更低的反作弊检测风险」。
本项目用等价的 CREATE_SUSPENDED + CreateRemoteThread(LoadLibraryW) + ResumeThread 实现。
2.3 ReShade 与 feeder 都必须拿掉
- feeder 自己的日志判定:
这游戏走 Streamline、自带 DLSS。OptiScaler 会捕获进程里每一个 NGX 调用, 所以它的神经通路会在游戏的 DLSS 上和这个 feed 上各跑一次。本项目是给没有 DLSS 的 游戏用的 —— 请用游戏自己的 DLSS 配 OptiScaler,并移除
dlss5-feed.addon64。 - OptiScaler 自己就挂在游戏自己的 DLSS 上(不需要 feeder):
DlssNr::EvaluateAfterUpscale DLSS-NR reached through the game's DLSS input DlssNr_Dx12::Dispatch DLSS-NR running at 2560x1440, guides 2560x1440 - ReShade 插进 D3D11 调用链会造成三方钩子冲突并崩溃:
(转储 198 MB 已存档)
### CRASH RECORDED ### exception 0xC0000005 at ...d3d11.dll crash stack: d3d11.dll <- reshade.dll <- winmm.dll <- unityplayer.dll
三、走过的死路(都不必再试)
| 路径 | 失败原因(实证) |
|---|---|
dxgi.dll 目录代理 ReShade |
被 ACE 辅助进程吞掉 → 「检测到黑客工具」 |
d3d12.dll 目录代理 ReShade |
注入成功,但 ReShade 的 Vulkan/后续链路与游戏冲突 |
| ReShade 的 Vulkan 层 | 引擎确定性崩溃:unityplayer.dll +0x57d123,0xc0000005,四次同偏移 |
| Deep Fried Chicken(DFC)作神经消费者 | ① hook_mode=AUTO 主动跳过 Streamline,而游戏的 DLSS 正走 Streamline v2 → 拿不到资源图(fail-open: complete native resource map unavailable, device=0)② DFC 的 private/standalone 桥在干净进程里也失败(host64 --test:feeder 300/300 通过,但 DFC 的 Feature18Create 返回 0xBAD00002 PlatformError + nvngx_dlssnr.dll 内 AV)→ 与 ACE、驱动、游戏均无关 |
-force-d3d12 |
该构建的 Unity 播放器没有 D3D12 后端(UnityPlayer.dll 有 force-d3d11 却无 D3D12CreateDevice),回落到 Vulkan |
| feeder 合成 DLAA 契约 | 本游戏自带 DLSS,多余(见 2.3) |
四、已知问题与调参
- 画面亮度快速闪动 ——
[DlssNr] WhitePointScale=auto会逐帧从画面测量白点, 实测在 1.35–1.41 来回扫,每一帧都缩放模型输出 → 亮度泵动。 改成固定值1.0(游戏自报曝光就是 1.0)。 该键实时生效,也可以直接在 OptiScaler 菜单里改。 - 菜单键:默认
Insert(0x2D)。很多键盘没有 → 已改0x24(Home)。 独占全屏下若按键被吞,切无边框窗口。 dlssnr-capture未生成 ——AutoCapture默认开,但实测未触发; 改用菜单里的 DebugView = 3(Difference) 判断模型是否在改画面: 整屏灰 = 什么都没改;有颜色 = 确实在改。- NVIDIA Smooth Motion:进程里有
NvPresent64.dll说明它开着。 Vulkan 路径下必须关(文档原文:永远无法共存);D3D11 路径文档说可以留, 但若出现闪动/串帧,用 NVIDIA Profile Inspector 的Smooth Motion - Enabled APIs(0xB0CC0875)清掉 DX11 那一位(7→5)。
五、操作速查
# 启动(桌面 .bat 等价)
H:\endfield-dlss5\launch.ps1
# 注入器手动用法
H:\endfield-dlss5\injector.exe --exe "H:\Arknights Endfield\Endfield.exe" `
--args "-force-d3d11 -launcher_lang=zh-cn -launcher_sub_channel=1" `
--basepath "H:\endfield-dlss5" --log "H:\endfield-dlss5\injector-last.txt" `
--dll "H:\endfield-dlss5\winmm.dll"
# 看神经通路是否在跑
Get-Content H:\endfield-dlss5\OptiScaler.log | Select-String 'DlssNr_Dx12::Dispatch|DlssNr::EvaluateAfterUpscale' | Select-Object -Last 5
# 完全回滚:删掉外部目录即可,游戏目录本来就干净
Remove-Item H:\endfield-dlss5 -Recurse -Force
Remove-Item D:\Desktop\终末地-DLSS5启动.bat -Force
验收判据(缺一不可)
injector-last.txt里[OK] ...winmm.dll,注入完成(1/1)OptiScaler.log有CheckWorkingMode OptiScaler working as winmm.dll, system dll loadedOptiScaler.log有StreamlineHooks::hookInterposer Streamline version: 2.10.3OptiScaler.log有DLSSFeatureDx12::InitDLSS _CreateFeature result: NVSDK_NGX_Result_SuccessOptiScaler.log有DlssNr::EvaluateAfterUpscale DLSS-NR reached through the game's DLSS input- 游戏目录外来文件数 = 0
六、产物清单
| 文件 | 作用 |
|---|---|
E:\deepseek\_tmp\feedkit\injector.cs / injector.exe |
注入器(C#,csc 编译,x64) |
H:\endfield-dlss5\launch.ps1 |
提权启动 + 注入(含两个已修 bug 的说明) |
D:\Desktop\终末地-DLSS5启动.bat |
用户入口(CRLF + 纯 ASCII) |
E:\deepseek\_tmp\feedkit\endfield-install-optiscaler.ps1 |
安装脚本 |
E:\deepseek\_tmp\feedkit\endfield-migrate-external.ps1 |
目录代理 → 外部注入 迁移 |
E:\deepseek\_tmp\feedkit\revert-endfield.ps1 |
回滚(按清单精确删除) |
E:\deepseek\game-backups\Endfield\ |
全部证据:日志、模块快照、崩溃转储(198 MB)、安装清单、安装前快照 |