1.2 版本阶梯——十二代DirectX演化主线


1.2 版本阶梯——十二代 DirectX 演化主线

本节摘要:把 DirectX 各世代排成一列,看到的不是功能清单的加长,而是抽象责任的三次松手:固定管线时代运行时全管,可编程时代交出着色器,显式时代连调度同步也交出来。本节沿版本阶梯拾级而上,讲清每级台阶解决了什么、又把什么新问题甩给了开发者。

从一份年代表开始

回顾 DirectX 版本史有个常见误区:把它读成"新版本修了旧版本的 bug"。更准确的读法是每一代都在重新回答同一个问题——运行时该替开发者管多宽。这个问题在 Direct3D 9 时代给出了"全管"的答案,在 10/11 时代收窄为"管线交给你,调度我留着",到 12 时代干脆摊牌"调度也归你"。看清这条松手线,你就明白为什么 D3D 12 的代码量数倍于 9,也明白为什么游戏行业反而集体拥抱它。

世代 约当年代 关键变化 开发者拿到的 / 失去的
DirectX 1–7 1995–2000 统一多媒体入口,Direct3D 立即模式站稳 拿到统一契约;失去对硬件特性的精细控制
DirectX 8 2000 首次引入可编程着色器(Shader Model 1) 拿到顶点/像素着色器;失去"零图形知识也能出图"的省心
DirectX 9 2002 SM 2/3 成熟, HLSL 问世,资源全托管 拿到高级着色语言;继续交出资源与状态管理权
DirectX 10 2006 Vista 的新驱动模型,状态对象化,SM 4 拿到几何着色器与更干净的状态机;失去 XP 兼容
DirectX 11 2009 计算着色器、曲面细分、多线程延迟上下文 拿到 GPGPU 正式入口;调度仍由驱动代劳
DirectX 12 2015 命令列表、描述符堆、根签名、显式同步 拿到接近底层的全部控制权;失去驱动代劳的一切舒适

图1 DirectX 抽象松手三阶段

图1 DirectX 抽象松手三阶段

第一级台阶:固定管线的黄金年代

Direct3D 9 是"自动挡"的巅峰。想画一个带光照的模型?设置变换矩阵、开一盏灯、提交顶点流,运行时把你的意图翻译成硬件操作,驱动在幕后处理资源放置、状态切换、显存搬运。那一代开发者的幸福在于专注创作:几行固定管线调用就能出画面,引擎团队的主要精力花在关卡与玩法上。

幸福背后是三重枷锁。其一,渲染效果被锁死在硬件支持的固定组合里,想要非标准的混合风格,只能变换矩阵与纹理坐标上玩杂技——多纹理坐标展开、渲染目标来回倒腾,全是绕路的智慧。其二,资源管理是黑箱:运行时替你决定资源放在显存还是内存、何时搬运,一旦行为不合预期,你既看不见也摸不着。其三,驱动成了性能的神秘变量:同一份代码在不同显卡厂商驱动上表现迥异,调优靠经验玄学。D3D 9 末期,主机级画面的需求已经把这个天花板顶得咯咯响。

第二级台阶:可编程革命与计算着色器

DirectX 8 引入着色器是第一次松手:渲染效果从"开关组合"变成"代码编写"。最初着色器是汇编风格的长串指令,直到 DirectX 9 推出 HLSL——用类 C 语言写着色器,编译器负责翻译。画面表现力自此爆炸:逐像素光照、程序化材质、后处理特效,固定管线时代的"杂技"变成了一行行可读的数学。

DirectX 10/11 把这次松手推向纵深。SM 4/5 让着色器指令集显著扩充;几何着色器让管线中途生成或销毁图元成为可能;曲面细分把模型细节交给 GPU 动态生成。更具历史意义的是 DirectX 11 的计算着色器:GPU 第一次以通用并行处理器的身份接入 DirectX 契约——物理模拟、后处理、AI 推理(后来的 DirectML 就长在这根地基上,第四章 4.3 节展开)都有了正式入口。

但请注意:这次松手只松了"效果编写权"。调度权仍在驱动手里——多线程提交在 D3D 11 里是"延迟上下文"的录多少算多少,真正的硬件队列依然由驱动说了算;资源驻留与搬运也仍是黑箱。于是出现了那个时代的经典困境:CPU 端每帧提交的驱动开销成为瓶颈,开发者明明知道瓶颈在哪,就是摸不到。业界要跨过这道坎,需要一个敢把调度权也交出来的世代。

第三级台阶:D3D 12 与手动挡时代

DirectX 12(2015,Windows 10)的立场是彻底摊牌:驱动不再是管家,而是翻译官。四大新概念撑起手动挡:

命令列表 Command List —— 渲染指令提前录制、反复重放,多线程并行录制 命令队列 Command Queue —— 显式声明提交到哪个硬件队列(图形/计算/拷贝) 描述符与堆 Descriptor —— 资源引用由开发者自己编排进堆,驱动不再代管映射 栅栏 Fence —— CPU 与 GPU 的同步点由开发者亲手安放

这四个名词现在只需混个脸熟——第二章讲设备初始化时会遇见队列与栅栏,第三章讲资源,第四章的描述符堆实验会亲手填充它们,第六章讲多线程时它们仨会再次集结。此处先记住因果链:驱动开销从"不可控的黑箱"变成"显式的代码",CPU 提交成本大幅下降,帧时间变得可预测。代价同样直白:初始化代码膨胀、资源状态转换要自己维护、同步出错就是画面撕裂或设备移除——本书第五章的排错实录会带你见识这些坑的现场。

还有一个常被忽略的视角:松手不只是"给高手松的"。D3D 11 与 12 长期并存,微软后续还推出 11on12 兼容层与更上层的封装,说明手动挡世界并不排斥自动挡学员——按自己的水平选挡位,本身就是这份契约成熟的标志。

版本史的正确打开方式

给三个务实建议。第一,面试或评审聊版本时,别背年表,讲因果:某一代为何松手、松了什么、换来什么。第二,选版本时看生态而非新旧:D3D 11 至今仍活跃在大量在售游戏与引擎里,它的托管模型对中小团队依然是效率最优解;"新即正义"是选型大忌。第三,盯住版本之上仍在生长的东西——HLSL、PIX 工具、DirectML,它们跨版本存在,学一次受用多个世代。

下一节我们把这辆车的品牌之争摆上桌面:同为手动挡,DirectX 12 与 Vulkan、Metal 开起来有何不同?留在自动挡的 OpenGL 还值不值得上?

补一张票:DirectX 12 不是静止的终点

顺着版本阶梯走到顶,还剩一块常被忽略的台阶:DirectX 12 自 2015 年发布后并没有停下脚步,而是以"12 之内再分代"的方式持续生长。2019 年前后微软提出 DirectX 12 Ultimate,把光线追踪(DXR)、网格着色、采样器反馈、可变速率着色四项特性打包成一个可检测的能力集合——硬件支持就全有,不支持就全没有,避免开发者面对"半支持"状态的碎片化判断。这其实是把 1.1 节那套能力检测的老问题换了个解法:从"逐项查标志位"升级为"验一整张门票"。

这段插曲印证了本节的主线:松手之后,契约并没有停止演化,只是演化方式从"换一代 API"变成了"在手动挡车上加装新仪表"。第七章讲前沿特性时会回到这四项,届时你会看到它们分别改写了管线的哪一段。

本节要点回顾

  • 一条主线:版本演化 = 抽象责任的三次松手(着色器 → 计算 → 调度同步),每次松手用自由换责任。
  • D3D 9 的天花板:效果锁死、资源黑箱、驱动开销不可控,倒逼可编程与显式化两场革命。
  • D3D 11 的历史位置:效果权与 GPGPU 入口已交出,调度权仍握在驱动手里——半自动挡。
  • D3D 12 四大件:命令列表、命令队列、描述符堆、栅栏,后续章节反复登场的旧相识。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U