D2DX架构全景:Glide API到DirectX 11转译引擎的设计哲学与核心组件
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),仅供参考

相关新闻

Android修改手机硬件标识:OpenGL渲染器与系统属性实战

Android修改手机硬件标识:OpenGL渲染器与系统属性实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:33:33 阅读更多 →
PlutoSDR+MATLAB环境搭建指南:驱动/固件/支持包安装与联调避坑

PlutoSDR+MATLAB环境搭建指南:驱动/固件/支持包安装与联调避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 1:33:33 阅读更多 →
Winhance Windows 优化工具路线图前瞻:即将上线的新功能与开发计划完整一览

Winhance Windows 优化工具路线图前瞻:即将上线的新功能与开发计划完整一览

Winhance Windows 优化工具路线图前瞻:即将上线的新功能与开发计划完整一览 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mi…

2026/9/25 1:33:33 阅读更多 →

最新新闻

openapi-typescript Node.js API 实战指南:程序化类型生成、transform 钩子扩展与源码管线解析

openapi-typescript Node.js API 实战指南:程序化类型生成、transform 钩子扩展与源码管线解析

开发工具代码生成后端 【免费下载链接】openapi-typescript Generate TypeScript types from OpenAPI 3 specs 项目地址: https://gitcode.com/gh_mirrors/op/openapi-typescript 点击查看 免费下载 本文基于 openapi-typescript 仓库中的 Node.js API 文档&#x…

2026/9/25 5:42:32 阅读更多 →
Java线性规划实现指南:从手写单纯形法到Commons Math接库

Java线性规划实现指南:从手写单纯形法到Commons Math接库

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 5:42:32 阅读更多 →
F´ Ground Data System(GDS)快速入门指南:安装、启动配置与 GUI 各标签页实操

F´ Ground Data System(GDS)快速入门指南:安装、启动配置与 GUI 各标签页实操

嵌入式系统编程 【免费下载链接】fprime F - A flight software and embedded systems framework 项目地址: https://gitcode.com/gh_mirrors/fpri/fprime 点击查看 免费下载 F Ground Data System(GDS)是 F(F Prime,…

2026/9/25 5:42:32 阅读更多 →
WPScan 插件版本动态检测解析:以 Pirate Forms 的 CHANGELOG.md 指纹文件为例

WPScan 插件版本动态检测解析:以 Pirate Forms 的 CHANGELOG.md 指纹文件为例

网络安全漏洞扫描渗透测试应用安全CLI 【免费下载链接】wpscan WPScan WordPress security scanner. Written for security professionals and blog maintainers to test the security of their WordPress websites. Contact us via contactwpscan.com 项目地址: ht…

2026/9/25 5:42:32 阅读更多 →
BAML 函数调用链基准测试解析:call-chain-100x10k 的设计原理与运行方法

BAML 函数调用链基准测试解析:call-chain-100x10k 的设计原理与运行方法

编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 导读 本文围绕 BAML 语言内置基准测试工具 speedtest 中的一个核心负载——call-chain-100x…

2026/9/25 5:42:32 阅读更多 →
使用 Sinon 对 ES Module 导入进行 Stub:esm 包与 mutableNamespace 完整实战指南

使用 Sinon 对 ES Module 导入进行 Stub:esm 包与 mutableNamespace 完整实战指南

测试开发工具 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon 点击查看 免费下载 ES Modules(ESM)的绑定是**静态解析、实时(live)且不可变…

2026/9/25 5:41:31 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →