# 终末地(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`)。 --- ## 五、操作速查 ```powershell # 启动(桌面 .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)、安装清单、安装前快照 |