首页/新闻资讯/正文详情

D2DX架构全景:Glide API到DirectX 11转译引擎的设计哲学与核心组件

发布时间:2026/9/25 1:33:22 来源:云帆数科 栏目:资讯中心
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:22

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:22

swipe-layout-cj进阶技巧:@BuilderParam自定义视图注入与@Link父子触摸协同机制详解
swipe-layout-cj进阶技巧:@BuilderParam自定义视图注入与@Link父子触摸协同机制详解

swipe-layout-cj进阶技巧:BuilderParam自定义视图注入与Link父子触摸协同机制详解 【免费下载链接】swipe-layout-cj 各种样式的滑动组件 项目地址: https://gitcode.com/Cangjie-TPC/swipe-layout-cj swipe-layout-cj 是一个基于仓颉(Cangjie&am… · 2026/9/25 1:33:16

Windows下FFmpeg稳定运行实战指南
Windows下FFmpeg稳定运行实战指南

简介:本资源为Windows平台专用的FFmpeg 4.2.1开发包,面向多媒体开发者、音视频工程师及进阶学习者,提供完整的C/C开发支持能力,解决Windows环境下音视频编解码、格式转换、流媒体处理及自定义应用集成等核心需求。压缩包含166个文… · 2026/9/25 2:14:10

Claude Code + Git 完整工作流:从安装到团队协作的版本控制指南
Claude Code + Git 完整工作流:从安装到团队协作的版本控制指南

如果你最近在用 Claude Code 写代码,估计你也有这种体验:它确实能帮你把活干完,但也真的让人提心吊胆——一句话下去,它可能一口气改掉十几个文件,你还没来得及反应,代码已经变了样。要是不小心把方向带歪了… · 2026/9/25 2:14:10

Yii 2 俄语本地化翻译工作流:框架消息提取、文档同步与团队协作实战指南
Yii 2 俄语本地化翻译工作流:框架消息提取、文档同步与团队协作实战指南

后端Web框架 【免费下载链接】yii2 Yii 2: The Fast, Secure and Professional PHP Framework 项目地址: https://gitcode.com/gh_mirrors/yi/yii2 点击查看 免费下载 导读 本文基于 Yii 2 官方仓库中面向俄语翻译团队编写的《Как работать над пе… · 2026/9/25 2:14:04

使用 BentoML 单步部署 SDXL Turbo:文本到图像推理服务的完整实战
使用 BentoML 单步部署 SDXL Turbo:文本到图像推理服务的完整实战

模型推理服务人工智能后端大模型MLOpsLLMOps 【免费下载链接】BentoML The easiest way to serve AI apps and models - Build Model Inference APIs, Job queues, LLM apps, Multi-model pipelines, and more! 项目地址: https://gitcode.com/gh_mirrors/be/BentoM… · 2026/9/25 2:14:04

RSUITE Avatar 头像组件完全指南:从基本用法到头像组、回退机制与源码原理
RSUITE Avatar 头像组件完全指南:从基本用法到头像组、回退机制与源码原理

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 Avatar 是 rsuite 中用于展示用户头像、品牌标识或占位图形的组件,配套的 AvatarGroup 用于… · 2026/9/25 2:14:03

claude-monitor 版本演进深度解读:从实时监控到官方限额信任层(CHANGELOG 全解析)
claude-monitor 版本演进深度解读:从实时监控到官方限额信任层(CHANGELOG 全解析)

AI 应用CLI 【免费下载链接】Claude-Code-Usage-Monitor Real-time Claude Code usage monitor with predictions and warnings 项目地址: https://gitcode.com/gh_mirrors/cl/Claude-Code-Usage-Monitor 点击查看 免费下载 claude-monitor 是一款面向 Claude Code… · 2026/9/25 2:14:03

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* 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:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* 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:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* 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:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码