Files
minecraft-dlss/docs/endfield-dlss5-recipe.md
T

8.3 KiB
Raw Blame History

终末地(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 调用链会造成三方钩子冲突并崩溃:
    ### CRASH RECORDED ### exception 0xC0000005 at ...d3d11.dll
    crash stack: d3d11.dll <- reshade.dll <- winmm.dll <- unityplayer.dll
    
    (转储 198 MB 已存档)

三、走过的死路(都不必再试)

路径 失败原因(实证)
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

验收判据(缺一不可)

  1. injector-last.txt 里 [OK] ...winmm.dll,注入完成(1/1)
  2. OptiScaler.log 有 CheckWorkingMode OptiScaler working as winmm.dll, system dll loaded
  3. OptiScaler.log 有 StreamlineHooks::hookInterposer Streamline version: 2.10.3
  4. OptiScaler.log 有 DLSSFeatureDx12::InitDLSS _CreateFeature result: NVSDK_NGX_Result_Success
  5. OptiScaler.log 有 DlssNr::EvaluateAfterUpscale DLSS-NR reached through the game's DLSS input
  6. 游戏目录外来文件数 = 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)、安装清单、安装前快照