D2DX架构全景Glide API到DirectX 11转译引擎的设计哲学与核心组件【免费下载链接】d2dxD2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions.项目地址: https://gitcode.com/gh_mirrors/d2/d2dxD2DX 是让《暗黑破坏神2》在 modern PC 上流畅运行的完整解决方案——它模拟 3dfxGlide 图形 API把游戏的全部绘制调用转译成DirectX 11指令从而带来高帧率、宽屏与抗锯齿支持。本文将从架构视角拆解这个Glide 到 DirectX 11 转译引擎的三层设计与核心组件帮助你理解它如何在 20 年前的老游戏与现代显卡之间架起桥梁。一分钟看懂 D2DX一个假显卡驱动 《暗黑破坏神2》当年使用 3dfx 的 Glide API 直接驱动显卡而今天的显卡早已不再支持这套接口。D2DX 的做法是向游戏提供一个名为glide3x.dll的假 Glide 驱动骗过游戏游戏以为自己在调用真正的 Glide实际上每个调用都被转发进 D2DX 的转译引擎最终以 DirectX 11 的形式渲染到窗口或全屏中。游戏内效果则如右图所示原始 640×480 的画面被高质量放大到现代 1080p 显示器上细节依然锐利。三层架构一条清晰的调用链D2DX 的源码位于 src/d2dx/整体分为三层职责泾渭分明游戏进程 (d2game.exe) │ 调用 grDrawVertexArray / grBufferSwap ... ▼ ① Glide 层 glide3x.cpp ────── 实现全部 Glide API 入口纯转发 │ 通过 D2DXContextFactory 单例获取上下文 ▼ ② 转译层 D2DXContext ─────── 维护 Glide 状态机把调用组装成批次(Batch) │ 同时处理 Win32 拦截与游戏内存探测 ▼ ③ 渲染层 RenderContext ───── DirectX 11 设备/交换链、着色器、缩放输出这种入口层只做转发、逻辑集中在上下文的设计让每一层都可以独立测试项目自带单元测试工程 d2dxtests/也方便第三方 MOD 接入。第一层glide3x.dll —— Glide API 的假驱动入口实现在 glide3x.cpp它用 C 风格导出了一整套 Glide 函数grSstWinOpen开窗口/全屏、grVertexLayout定义顶点格式、grDrawVertexArrayContiguous批量提交顶点、grBufferSwap交换帧缓冲等。每个函数内部都遵循同一个套路——以 grDrawVertexArrayContiguous 为例用_ReturnAddress()取回调用方返回地址交给上层用于判断这帧画的是游戏还是菜单转发给 D2DXContextFactory::GetInstance() 返回的单例上下文用try/catch包裹一切异常保证游戏进程绝不崩溃。还有一些聪明的兼容细节例如 grLfbLock 只为游戏真正会用到的 640×480 RGBA 写锁模式分配内存其余调用一律返回不支持最大限度贴近原始驱动行为。第二层D2DXContext —— 状态机与批次组装核心类 D2DXContext 实现了三个接口见 ID2DXContext.h接口职责IGlide3x响应全部 Glide 调用OnDraw*、OnTexSource、OnGammaCorrectionRGB…IWin32InterceptionHandler拦截SetCursorPos、Sleep等 Win32 调用ID2InterceptionHandler拦截游戏内部文字/图块绘制服务运动预测它的工作方式很像一个迷你状态机纹理内存模拟维护一块虚拟 TMU 显存GlideState::tmuMemory游戏的grTexDownloadMipMap把像素下载到这里grTexSource指定纹理地址批次(Batch)组装每次grDrawVertexArray*调用都会按当前混合/颜色模式归入 Batch相同状态的顶点被合并提交减少状态切换开销帧循环OnBufferSwap触发整帧绘制此时依次执行纹理哈希、运动预测修正、批次提交能力协商通过 Feature 标志位声明当前游戏版本支持哪些增强单位/文字/天气运动预测实现特性降级而非整体失效。第三层RenderContext —— DirectX 11 渲染管线RenderContext 负责所有与显卡打交道的事创建ID3D11Device与IDXGISwapChain成员定义并实现了多套策略化的同步与交换方式——AllowTearing无垂直同步、最低延迟、Interval0/1、以及基于ID3D11DeviceContext1::SetFrameLatencyWaitableObject的帧延迟控制这就是它低延迟全屏的来源。画面输出阶段由一组 HLSL 着色器完成src/d2dx/ 下均为独立文件DisplayIntegerScalePS.hlsl整数倍缩放保持像素锐利DisplayNonintegerScalePS.hlsl非整数缩放采用抗锯齿最近邻采样避免糊化DisplayCatmullRomScalePS.hlsl 与 DisplayBilinearScalePS.hlsl偏柔和观感的可选滤镜GammaPS.hlsl实现正确 gamma 校正保证暗部细节。纹理缓存FNV 哈希 位图 PMRU 淘汰Glide 把纹理下载到显存再采样而 D2DX 需要把它们变成 D3D11 纹理供着色器使用。TextureCache 用**固定尺寸的四张纹理图集atlas**存放所有游戏纹理内容键由 TextureHasher 基于FNV1a 哈希第三方实现见 thirdparty/fnv/计算避免重复纹理占用空间淘汰策略不是简单的 LRU而是自定义的 位图 PMRUprobabilistic MRU对反复使用的 UI 纹理与一次性场景纹理都有更优的命中率图集满时自动按策略驱逐旧纹理整帧开始还会调用OnNewFrame刷新访问统计。高帧率秘密三套运动预测器 原版游戏锁定 25 FPS直接解锁帧率只会得到跳帧。D2DX 的思路是在渲染层插值位置——既然游戏逻辑每 25ms 更新一次单位坐标那在中间帧里按速度外推即可。对应三个组件UnitMotionPredictor追踪每个单位的lastPos → velocity → predictedPos见 UnitMotion 结构实现人物、怪物、投射物、阴影的平滑移动TextMotionPredictor跟随滚动的伤害数字等文字WeatherMotionPredictor雨雪天气粒子。配合 GameHelper 对游戏内存的 FPS 补丁TryApplyInGameFpsFix、TryApplyMenuFpsFix和睡眠修复菜单与游戏内都可以稳定跑在 60 FPS 以上。Win32 拦截与内存探测Detours 的功劳D2DX 借助微软 Detours 库封装在 Detours.cpp挂钩两类入口Win32 API拦截Sleep消除卡顿微停顿、拦截SetCursorPos把鼠标约束在窗口内OnSetCursorPos游戏内部函数通过返回地址匹配IdentifyGameAddress定位文字/图块绘制函数为运动预测提供每帧真实坐标。此外 CompatibilityModeDisabler 会主动阻止 Windows XP 兼容模式它会导致画面花屏体现了现代环境跑老游戏的设计立场。与第三方 MOD 协作ID2DXConfigurator 接口D2DX 还暴露了一个类 COM 的公开接口 ID2DXConfigurator供高分辨率 MOD 调用SetCustomResolution(w, h)告知 D2DX 使用自定义游戏分辨率内置宽屏 MOD 自动让位GetSuggestedCustomResolution()获取与显示器比例匹配的推荐分辨率。这是典型的开闭设计核心行为可被外部扩展覆盖而不需修改 D2DX 本身。分辨率 MOD 的底层则内嵌了 SGD2FreeRes以 lzma 压缩打包运行时经 pocketlzma 解压由 BuiltinResMod 加载。画质开关FXAA 与宽屏选项抗锯齿由 FXAA 实现基于 Timothy Lottes 的公开实现只作用于锯齿明显的边缘不破坏像素风。对比效果如下全部行为都可通过配置文件 d2dx-defaults.cfg 定制复制到游戏目录并改名为d2dx.cfg窗口区段scale1-3整数缩放、position、frameless无边框窗口游戏区段自定义size与filtering锐利 / 双线性 / Catmull-Rom关闭项区段nowide、noaa、nomotionprediction等可逐项回退到原版体验。例如设置nowidetrue后标题画面会以约 4:3 的整数缩放模式呈现快速上手获取与验证 仓库为只读镜像克隆后只需把编译产物glide3x.dll拷入《暗黑破坏神2》目录git clone https://gitcode.com/gh_mirrors/d2/d2dx启动游戏时加参数-3dfxGame.exe -3dfx之后 ALT-Enter 即可在窗口与全屏间无卡顿切换。小结这套架构最值得学习的地方 ✨边界清晰Glide 入口层零逻辑状态机与渲染器分层解耦单测工程可直接验证批次、SIMD 与缓存逻辑策略化而非硬编码缩放滤镜、同步策略、纹理淘汰均可配置/可替换渐进式增强Feature标志 多版本适配1.09d~1.14d新特性默认开启又随时可关生态友好ID2DXConfigurator让 D2DX 成为可被其他 MOD 编排的渲染平台而不只是一个独立的 MOD。从 Glide 到 DirectX 11D2DX 用不到两万行 C 证明了理解旧 API 的每一处怪癖就能让 25 年前的游戏在现代显卡上跑出它从未有过的流畅。【免费下载链接】d2dxD2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions.项目地址: https://gitcode.com/gh_mirrors/d2/d2dx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
