30 系 DLSS 帧生成,可行?

RTX 30 系用户被官方挡在 DLSS 帧生成门外?dlssg_for_sm86 把光流路径搬到了 Ampere,本文拆解原理、接入方式、延迟代价与三类兼容性陷阱,帮你判断要不要上。

源仓库: sdli1995/dlssg_for_sm86

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 走两条链路:

  1. OFA 计算相邻两帧的光流矢量
  2. 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 架构白皮书