DirectX
2024-11-01 11:30:29 阿炯

DirectX(Direct eXtension,缩写:DX)是由微软(Microsoft)公司创建的一系列专为多媒体以及游戏开发的应用程序接口。旗下包含Direct3D、Direct2D、DirectCompute等等多个不同用途的子部分,因为这一系列API皆以Direct字样开头,所以DirectX(只要把X字母替换为任何一个特定API的名字)就成为这一巨大的API系列的统称。目前最新版本为DirectX 12,随附于Windows 10操作系统之上。


DirectX被广泛用于Windows、Xbox电子游戏开发,并且只能支持这些平台。除了游戏开发之外,DirectX亦被用于开发许多虚拟三维图形相关软件。Direct3D是DirectX中最广为应用的子模块,所以有时候这两个名词可以互相代称。其最早内置于Windows 95 OSR2。

DirectX主要基于C++编程语言,并遵循COM架构。相关组成的组件有:
Direct3D:主要用于绘制3D图形。
Direct2D:主要提供2D动画的硬件加速,为DirectDraw的替代者。
DirectWrite:主要字体显示API,提供使用GPU令字体显示更为平滑,类似ClearType(只支持于Windows Vista/7/8/8.1以上)。
DirectInput:用于结合键盘、鼠标、摇杆,或其它的游戏控制器。
XInput:主要用于Xbox360的控制器。
XAudio2:主要用于低延迟游戏音频播放。
DirectCompute:GPU通用计算API。
DirectXMath:针对游戏优化的高速数学运算API,特别支持单精度浮点运算及矩阵运算,使用SSE2指令集。
DirectSetup:用于DirectX组件的安装,以及检查DirectX的版本。
DirectX Media:包含DirectAnimation可用于2D的网页动画,DirectShow可支持多媒体录音以及资料流媒体,DirectX在网页上的转换,还有Direct3D可保留3D图像更清晰的解析。DirectShow亦包含有DirectX插件用于音频信号处理以及DirectX视频加速加速影音播放。
DirectX媒体对象化:支持资料流对象,像是编码、解码和效果。

1994年末,微软即将推出新一代操作系统Windows 95。决定新操作系统的最终价值的因素在于究竟新系统能运行哪些程序。微软的三个员工:Craig Eisler、Alex St. John、Eric Engstrom十分关心这个问题,因为不少游戏程序员更喜欢在DOS系统下编写游戏,这意味着,没有多少人愿意为WIN95编写游戏,新操作系统不会获得多少成功。这三个叛逆的微软程序员,创造了一项伟大的技术,彻底颠覆了游戏行业。

DOS允许直接访问显卡、键盘、鼠标、声卡以及其他系统硬件设施。而Windows 95出于保护存储系统的目的,限制了对硬件的直接访问,取而代之的是一套更加规范标准的访问方法。微软需要一种方法让程序员在WIN95中也能编写出高效的程序。此时,离新系统发布不到几个月了。St. John和Engstrom联合解决了这个问题,他们将解决方案称为DirectX。

DirectX的第一个版本作为Windows Games SDK发布于1995年9月,它作为Windows API的一部分用以替换Windows 3.1中的DCI和WinGAPI。ATI的一个开发团队为微软带来了基本的游戏图像技术,微软方面,DirectX由专门的团队负责开发,Eisler为团队领导,而St. John和Engstrom则成为主程序设计师。

全新的图形化界面,即插即用的功能,便捷的操作,32位抢占式多任务系统,让Windows 95成为个人电脑历史上最重要的产品之一。伴随着10亿美元的营销活动,Windows 95在全世界都引发了轰动,掀起了抢购的热潮。但有一个群体一直在冷眼旁观,他们坚决不愿意把自己的软件移植到Windows95上。他们就是游戏开发商,他们在前一年发布了无数经典的PC游戏:《Descent》、《DOOM II》、《Heretic》、《Jazz Jackrabbit》、《System Shock》、《UFO:未知敌人》和《魔兽世界:兽人与人类》,只不过,这些游戏统统运行在MS-DOS上。为什么游戏厂商要抛弃Windows平台呢?

1、曼哈顿项目

虽然MS-DOS只支持单任务,但是相比Windows它有个明显的优势:游戏开发者可以直接访问硬件(如显卡、键盘、鼠标、声卡等),游戏可以充分利用硬件的性能,创造出复杂的图形和声音效果。而“可恶的”Windows,为了强调稳定性和多任务,竟然阻止游戏开发者直接访问硬件,必须通过Windows API才能访问,这一下子就拉低了游戏性能。所以,很多游戏开发者对Windows望而却步。

当时的微软考虑到了游戏厂商的需求,也提供了一个叫做WinG的图形引擎,但这个引擎非常烂,迪斯尼用它开发了Windows版的《狮子王》,结果频繁蓝屏,愤怒的家长都快把迪斯尼的热线电话打爆了。无数游戏玩家都在期待在Windows上玩游戏,但是他们都失望了。

Alex St. John决心改变这个状况,他认为:想让Windows成为主流,必须要围绕游戏构建,让人们玩起来。自从加入微软开始,John就以反传统著名,他叛逆和傲慢多次激怒比尔盖茨,好几次差点儿把他解雇。


John在公司内找到了“臭味相投”的Craig Eisler和Eric Engstrom,三人的特点都是会公开蔑视那些不同意他们想法的同事,这种做派被很多同事讨厌。

三人组成了“野兽男孩”小组,开始了一个代号“曼哈顿”的项目,计划开发一个新的软件包,帮助游戏厂商充分利用Windows。他们并没有得到微软内部的支持,公司管理层认为Windows 95成为游戏平台的可能性很低。但是“野兽男孩”三人组可不管这些,他们决心强力推进:DOS不是能直接访问硬件吗?那用我这个软件包也能绕过操作系统,把Windows推到一边,清除所有与游戏争夺资源的垃圾,让游戏运行。

软件包许多功能会关闭 Win图形系统,让游戏可以与视频硬件直接对话:阻止 Windows 将内存分页到硬盘,以便游戏可以以恒定的帧速率运行;绕过 Windows 消息队列,以便您可以获得实时鼠标输入。这样就可以真正控制像 Doom 这样的第一人称射击游戏。

在 ATI 等显卡制造商的支持下,新的软件包很快就开发出来:
- DirectDraw:负责2D图形绘制。
- Direct3D:用于处理3D图形。
- DirectSound:用于处理声音。
- DirectInput:用于处理输入设备(如键盘、鼠标、游戏手柄等)。
- DirectPlay:用于处理网络多人游戏。

这些 API 背后的命名理念是允许游戏“直接”访问硬件,在游戏运行时尽量减少 Windows 操作系统的干扰。

当时有一位记者嘲笑了这种命名惯例,把它们称为“DirectX”。John团队很喜欢这个名称,DirectX一直沿用至今。


因为项目代号“曼哈顿”,和多年前的核武器计划名称一样,最早的DirectX Logo 是这样的,有种核辐射的感觉。

2、样板工程

微软拥有了DirectX,接下来就是吸引游戏厂商来使用它。微软先盯上了id Software,这个只有10几个人的团队开发的《DOOM》在全球极其流行,安装量竟然超过了Windows,Bill Gates一度都想把它收购了。


微软联系了id Software的负责人,也是传奇程序员John Carmack,提出了一个他无法拒绝的条件:由微软免费将DOS版本的《DOOM》和《DOOM II》移植到Windows,不用id Software出一分钱,将来游戏发行赚的钱也全部归id Software。

在微软的历史上,做出这样“卑微”的举动,是非常少见的。既然John Carmack可以坐享其成,就把游戏的源码给了微软。


移植的工作由加布·纽维尔负责,这也是一位超级大牛,1996年离开微软后创办了Valve,开发了《半条命》,又领导了Steam平台的开发。


1996年8月20日,DOOM95正式发布,成为第一款DirectX游戏。它不仅在Windows上运行效果出众,在多个方面都优于其原始的DOS版本,它能以“高达”640x480 的分辨率渲染游戏,支持 24 个音频通道,并通过图形用户界面简化了多人游戏设置。


微软把DOOM95作为宣传Windows的关键资料,比尔盖茨也参与其中,他录制了一段视频,穿着风衣,拿着猎枪,在DOOM的世界里一边开枪杀死各种怪物,一边推销Windows和DirectX。微软的意思很明确:最牛的游戏都登录Windows平台了,你们在等什么呢?

3、争霸之路

但这个时候,大家对DirectX的评价并不高。虽然DOOM移植成功,但John Carmack一直认为,DirectX是个糟糕的API,“它给使用它的程序员带来了巨大的痛苦和折磨,却没有带来任何显著的优势。”

大家更喜欢另外一个图形API,也是市场的霸主,OpenGL

OpenGL起源于SGI,这家公司知道的人不多了,当年它可是3D图形工作站的领导者,著名的《侏罗纪公园》就是使用SGI的高端工作站渲染的。

SGI在图形这一块的实力非常强悍,为了进一步占据市场,SGI把自己的图形API(IRIS GL)做成了开放标准,即OpenGL。


OpenGL有个架构评审委员会,ARB(Architecture Review Board),这里边包括IBM,Intel,Apple,ATI,Nvidia,Sun 等巨头。

有巨头撑腰,在整个90年代,OpenGL人气极盛,尤其是id Software使用 OpenGL 开发的的 Quake Engine ,达到了极为惊人的绘制效果。


这也激励着ATI、Nvidia等显卡制造商,必须完整地支持OpenGL,才能满足开发者和玩家的期望。软件和硬件互相“激励”,达成了螺旋上升的正向循环,可以说是势不可挡。这时候微软的DirectX杀了进来,它该如何破局呢?

快速迭代!

OpenGL是个开放标准,每次API标准的发展,都要受到到各个软硬件厂商的拉扯,大家为了自己的利益迟迟无法达成共识。微软虽然也比较官僚,但仅仅需要与 ATI 以及 Nvidia 两家公司合作制定DirectX 的 API 规格,并且拥有最终的关键裁量权,可以快速迭代,快速发展。就这样,DirectX虽然一直落后,但就像一个打不死的小强,韧性十足,一点点改进,终于赶了上来。


2001年发布的DirectX 8成了整个战役的转折点,这个版本引入了两个极为重要的创新:Vertex Shader(顶点着色器) 以及 Pixel Shader(像素着色器),赋予开发者在顶点和像素处理上的完全控制权,推动了 3D 游戏画质和性能的快速提升。

而DirectX 9 的推出,更是让微软取了决定性的胜利,大部分游戏开发者都开始使用DirectX。到了2011年,就连John Carmack也认为:DirectX比OpenGL更好了。


虽然OpenGL在PC的竞争上落败,但是它的嵌入式版本Open GL ES却抓住了移动互联网的浪潮,被Android 和 iOS采用,随着手机的普及,成为历史上部署最广泛的 3D图形 API。(后来Apple另起炉灶,推出了自家的Metal,OpenGL ES也进化为Vulkan,那是另外一个故事了)。

4、小结

在微软帝国的发展历史上,它多次利用操作系统的优势来击败竞争对手,Office之战、IDE/编译器之战、浏览器之战都是如此。但是DirectX是微软少见的,主要靠自己一刀一枪打下江山的产品,它不但把游戏厂商从MS-DOS迁移到Windows平台,更是击败了霸主OpenGL,这是很难得的。不过,由于微软错失了移动互联网,DirectX也主要用于Windows和XBox平台,没法扩展到手机端了。


DirectX出现之前,微软已经将OpenGL包括在Windows NT系统中,而在当时,OpenGL对硬件要求严苛,这限制了一些工程师和CAD用户。Direct3D就作为OpenGL的代替品被加入DirectX。随着硬件技术的发展,OpenGL成为行业标准,一场“战役”发生在DirectX的支持者和OpenGL的支持者之间,而且前者只支持Windows平台,而后者支持多平台。在实际应用中,游戏开发者常常两者同时使用,因为DirectX支持许多OpenGL所不支持的功能,比如音效和输入设备。而选择混合使用OpenGL和OpenAL的队伍也在壮大。

由此派生出的“特别DirectX”也作为微软Xbox和Xbox 360的图形API,这套API由微软和NVIDIA公司共同开发,Xbox API和DirectX 8.1比较相似,但跟其他主机科技一样不能更新,Xbox版本也叫做DirectXbox,但由于商业销售缘故,还是被简称为Xbox。

2002年,微软发布了DirectX 9,它支持最新的顶点阴影着色器2.0版本,又于2004年4月将shader model 3.0(SM 3.0)加入了DirectX 9.0c。

2005年4月,DirectShow从DirectX移除,加入到Microsoft Platform SDK。

2010年6月7日发布的DirectX SDK是最后独立发布的SDK版本,之后的DirectX SDK被集成进新版的Microsoft Windows SDK里。例如DirectX 11.2 SDK被放在Windows Software Development Kit (SDK) for Windows 8.1里。

硬件制造商要为每款硬件产品编写驱动程序来支持DX,甚至一些硬件商只编写DX的驱动,这意味着要使用这款硬件就必须安装DX,早期的DirectX版本自带了所有支持DX硬件的驱动程序,后来用户可以通过自动更新系统下载适合的驱动。DX10之前的所有DirectX版本都保持向下兼容性,即新版本兼容旧版本,例如安装了DX9的电脑,依然可以执行由DX6编写的代码。安装了DX11/12的电脑,依然可以执行由DX9C编写的代码,不过小部分依然需要安装DX9C。


5、各种版本

.NET Framework

2002年间,微软发布一个兼容.NET Framework的DX版本,因而允许程序员充分利用.NET的特性编写DX程序,这套API被称为Managed DirectX(MDX)。2005年微软在DirectX 9.0c版本上开发一套正对.NET平台的Managed API,即Direct 9.0 for Managed Code 1.0(简称Managed DirectX)。2005年12月、2006年2月、4月、8月,微软相继发布DirectX的更新版本,使之支持.NET 2.0框架。然而.NET 2.0版本至今只是个测试版。

GDC 2006期间,微软终止开发Managed DirectX,改推出了XNA framework,是一组基于Managed DirectX,帮助程序员更轻松的编写游戏的框架,将DirectX,Shader,高级着色器语言(HLSL)以及其他工具集成到一起。2006年12月11日,微软对Windows XP提供免费的XNA Game Studio Express RTM的下载服务。

DirectX 10

Windows Vista及以上的操作系统才支持DirectX 10(也就是说,DirectX 9是最后一个支持Windows XP的版本),比起之前的版本,DX10做了重大的变动:增加了XInput用以处理XBOX 360手柄的支持,DirectSound将被XACT替换。DirectX 10也减少了对音效硬件加速的支持,更多的使用CPU来运算音效。Direct3D 10.1是DirectX 10的改进版,随Vista SP1出货。

DirectX 11

DirectX 11是DirectX 10的改良,只对性能和扩展性进行优化,主要改进在提供Shader Model 5.0,加入对MSAA的直接采样控制。大幅改进多线程性能,提供三个独立的接口。进一步提高纹理压缩,镶嵌(tessellation)处理的性能[6][7],并加入Compute Shader(DirectCompute)来支持GPGPU,提供新版HLSL语言。

DirectX 11.1是DirectX 11的改进版,随Windows 8出货。Windows 7 SP1升级后部分支持。DirectX 11.2是DirectX 11.1的改进版,随Windows 8.1出货。

DirectX 12

DirectX 12将更好支持多核心、多线程的优化,降低GPU处理瓶颈,并强化跨平台功能,可有效支持微软各式平台,并提升硬件功耗表现。随Windows 10 出货并支持Xbox One。

2019年3月13日,微软于DirectX Developer Blog表示,未来魔兽世界8.1.5的游戏更新将使Windows 7 平台用户也能体验 DirectX 12的多线程渲染优势,并提高游戏性能。且未来陆续也会有其他厂商推出相关更新,将更多的 D3D12 游戏移植到 Windows 7。