30 系 DLSS 帧生成,可行?
RTX 30 系用户被官方挡在 DLSS 帧生成门外?dlssg_for_sm86 把光流路径搬到了 Ampere,本文拆解原理、接入方式、延迟代价与三类兼容性陷阱,帮你判断要不要上。
30 系 DLSS 帧生成,可行?
dlssg_for_sm86 是个逆向思路的产物:NVIDIA 把 DLSS Frame Generation(DLSSG / DLSS 3)锁在 RTX 40 系(Ada,SM89),作者 sdli1995 把这条路径”修”到了 SM86——也就是 RTX 30 系 Ampere 上。仓库刚过 ⭐1.7k,issue 区每天都在涨讨论。核心问题一句话:30 系保有量巨大,“凭什么 40 系才能开帧生成”成了反复被顶的痛点。
一、为什么 RTX 30 系官方不支持帧生成?
DLSS Frame Generation 不只是软件算法,它依赖硬件光流加速器(Optical Flow Accelerator, OFA)。Ampere(SM86)虽然也内置了 OFA,但 NVIDIA 在驱动层关闭了 DLSSG 的调用入口——这是商业策略:把帧生成当 40 系独占卖点。
具体来看,DLSSG 走两条链路:
- OFA 计算相邻两帧的光流矢量;
- GPU compositor 把插值帧合成后输出到 SwapChain。
Ampere 的 OFA 算力够用,但驱动不暴露 NVAPI 的 NvAPI_D3D_QueryFrameGenerationSupport 入口给 DLSSG SDK。结果是:理论上能跑,路径上被锁。这正是 dlssg_for_sm86 想撬开的口子。
二、dlssg_for_sm86 是怎么”绕”过去的?
仓库的核心做法是:把 DLSSG SDK 自带的 nvngx_dlssg.dll 替换为本仓库编译的等价模块,并在驱动之上做一层 hook,让应用看到的 GPU 报告从 SM86 变成”伪 SM89”。
核心代码片段(简化自 dllmain.cpp):
// 伪 SMID 上报,让上层 SDK 误以为在 40 系
extern "C" __declspec(dllexport)
uint32_t NvAPI_D3D_GetGPUInformation(...) {
auto* info = /* ... */;
info->smVersion = 0x89; // 伪装成 Ada
return 0;
}
外层再注册一对虚函数表(vtable hook),拦截 IDXGISwapChain::Present 之后插入光流计算与插帧调度。这种做法对 30 系用户是福音,但对游戏厂商并不友好——它绕过了 SDK 授权校验,issue 区已经有人讨论是否会触发反作弊封号(《无畏契约》《Apex》明确不支持,绕了也没用)。
三、怎么把它接入一个 DirectX 12 游戏?
最简单的接入方式是 DLL 注入 + 环境变量。流程如下:
# 1. 拉代码并编译
git clone https://github.com/sdli1995/dlssg_for_sm86
cd dlssg_for_sm86 && mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release
# 2. 注入到目标进程(以游戏 exe 为例)
./injector.exe --target game.exe --dlssg ./dist/nvngx_dlssg.dll
几个必须确认的前置:
- 游戏必须原生调用 NVAPI 的 frame generation 接口,否则没东西可”插”;
- 把
nvngx_dlssg.dll放到 exe 同目录,优先级高于系统 NVNGX; - 关闭 VSync、关闭 HDR——issue 区大量报告说这两个会和 hook 链路冲突导致黑屏;
- 关闭任何 overwolf、Rivatuner 帧率覆盖层,避免注入器被反外挂拦截。
四、帧生成的”延迟税”怎么算?
帧生成不是免费的——它会带来额外输入延迟,30 ms 起步是常态。Ampere 的 OFA 算力只有 Ada 的 60% 左右,所以插帧等待队列更长。
issue #142 用户在 RTX 3080 + 1080p 下用 PresentMon 测出的数据:
- 关闭帧生成:原生 60 fps,PC latency 18 ms
- 开启帧生成:120 fps,PC latency 31 ms
降低延迟的唯一靠谱办法是 NVIDIA Reflex(如果游戏支持)。但 Reflex 走的是另一组 NVAPI 接口——30 系下能不能和 dlssg_for_sm86 共存,需要你逐款游戏验证。issue #87 反馈《赛博朋克 2077》可以,《心灵杀手 2》会偶发崩溃。
五、兼容性边界:哪些游戏能跑、哪些不能?
issue 区整理的兼容矩阵大致是:
| 状态 | 例子 |
|---|---|
| ✅ 稳定 | 《赛博朋克 2077》《霍格沃茨之遗》《瘟疫传说 安魂曲》 |
| ⚠️ 偶发崩溃 | 《心灵杀手 2》《使命召唤:现代战争 III》 |
| ❌ 黑屏 / 闪退 | 任何调用 Vulkan 的 DLSSG 实现、《无畏契约》《Apex》 |
核心判断方法:游戏用的是 D3D12 + NVAPI frame generation,而不是 Vulkan 或 D3D11。仓库 README 也明确写”目前仅 D3D12 路径”。如果你要部署到一台生产环境的网吧机器,建议先在样本机型上跑 2 小时稳定性测试,再决定推广。
Sources
- GitHub Trending 2026-09-12,repo
sdli1995/dlssg_for_sm86 - Issue #142:RTX 3080 PresentMon latency test
- Issue #87:与 NVIDIA Reflex 共存崩溃报告
- r/ClaudeAI 讨论串:“Reverse engineering DLSSG on Ampere”
- NVIDIA Developer Docs:Optical Flow SDK 与 DLSS 3 架构白皮书