微软游戏编程接口———DirectX

 当前几年Internet上叫喊可以控制我们的操作平台,但管不了我们玩什么的时候,微软开始了向游戏领域的进军。事实上,促使微软向这个领域进军的真正原因并不是这些反微软的言语,而是游戏娱乐业巨大的利润和美好的市场前景。微软不愧是微软,它并不仅仅是开发极具竞争力的游戏参与大堆游戏公司的竞争,而且开发了一个供所有开发者使用、基本上是免费的游戏开发平台———DirectX。

 

随着DirectX7.0的推出,也确立了DirectX在游戏标准方面不可动摇的地位。 DirectX 实际上是一个软件开发包,即DirectXSDK。它包括运行期文件和开发时所需要的头文件和库文件,我们平时玩游戏时所安装的DirectX实际上是它的运行期文件。Win98所谓的“多媒体功能更加丰富”就是因为内置了DirectX5.0的运行期文件。虽然DirectX的运行期文件也是一大堆的.dll和.lib文件,但是它的内部实现不同于一般的.dll,这主要是因为DirectX的代码开发符合COM组件规范,可以说Di-rectX是COM组件的集合,因此,在DirectX3.0下开发的游戏可以流畅地在DirectX6.0下运行也就不足为奇了。微软在刚刚发布的DirectX7.0中,加入了对VB开发的支持,而在这以前,游戏编程还是C /C ++程序员的专利。

DirectX 的“Direct ”实现了Windows 下不该实现的功能———直接访问硬件。众所周知,在Win d o ws 下,我们的操作不知经过Win d o ws 的多少抽象才能被硬件执行,而这也是Win d o ws 多任务与“相当稳定”的基础。DirectX违反Win d o ws 的规则了吗?因此有人批评微软的DirectX使Win d o ws 回到了DOS 时代。千万别相信这种话,微软不会这么笨。实际上,微软在Win-dows 与DOS 之间进行了折衷,提供了双方共有的优点。

一方面,DirectX提供了Win d o ws 编程时抽象的接口,使程序员可以不考虑特定的硬件,另一方面,Di-rectX提供了DOS 时代硬件的基本性能,用一句术语来说就是,DirectX“以设备无关的方法提供了设备相关的性能”。DirectX最大的发挥了硬件的优势,这主要应归功于它先进的实现结构。Di-rectX的底层实现分为HAL层(硬件抽象层,HardwareAbstraction Layer)与HEL层(硬件模拟层,Hardware Emu-lation Layer)。它们二者组合起来一起响应DirectX的请求,当DirectX对象创建时,它将查询相应的硬件并把硬件支持的操作填进HAL的兼容列表中。当我们使用DirectX的某项功能时,DirectX将首先查询HAL,若硬件支持这项功能,则直接让硬件去完成这项功能,否则让HEL层去模拟硬件处理。凡是硬件能做的,都让硬件去做,这的确发挥了硬件的优势,并且将激励硬件开发商去支持HEL层中的功能(无论如何,硬件支持总是要比软件模拟的快),从而又成为微软的标准,很妙的技术与很妙的商业手法!它们的结合正是微软成功的关键。 DirectX 包括下列组件:DirectDraw,Direct3D,Di-rectPlay,DirectInput,DirectSoun d,DirectSetup,Auto-play,从DirectX6.1开始又增加了DirectMusic。它们其实是各自独立的COM组件,但它们又是一个高水平游戏的开发过程中所不可缺少的部分。 DirectDraw 主要管理2D显示方面的事情。

Di-rectDraw字面的意思是“直接画”,用DOS 时代的术语是“直接写屏”,游戏开发者使用DirectDraw可直接操纵显卡上的显存,可把块显存想象为显示器的屏幕,利用硬件支持的诸如位图拷贝、覆盖、页面交换、透明和半透明、调色板处理等2D常用的技术在显存中处理图形,然后由显卡将显存中的内容显现在显示器上。而Win d o ws 中的GDI 函数(图形设备界面)不知要经过多少次Win d o ws 的“抽象”才能将图形搬到显存中。看看《红色警戒》《星际争霸》之类的游戏你就知道Di-rectDraw到底有多好的性能了。 Direct3D 分为立即模式(Immediate Mode)和保留模式(Retained Mode)。立即模式以DirectDraw对象为基础,是比较低级的3D图形接口,而保留模式则构建于立即模式之上,是较高级的3D图形接口。立即模式比保留模式更难用一些,不过如果用的好的话,可以获得很好的性能。保留模式封装了立即模式函数的接口,虽然更好用一些,但没有立即模式灵活。在刚刚推出的DirectX7.0中,Direct3D的性能得到了大幅的提高,并且增加了许多新的功能。据说,微软将在DirectX8.0中把OpenGL也集成进去,叫做Fahrencheit(这个名字是我刚从网上看到的),我们拭目以待吧。 DirectS ound 主要是录制和回放高性能的、实时的声音。如果在游戏中只有偶尔的一点声音,还不如用Win32API 的PlaySo u n d 函数。但如果在同一场景中出现几种声音(如在飞机的轰鸣声中出现爆炸声与开炮声),DirectSo u n d 就发挥它的优势了。

DirectSo u n d 可让程序员直接操纵声卡中的存储缓冲区(相当于显卡中的显存),利用声卡的硬件加速功能进行混音、播放。并且DirectSo u n d 还支持3D声音定位效果,能与Di-rect3D进行无缝的混合。表现这种效果最好的设备是头戴式耳机,千万别以为上千元的音箱在所有方面的效果都比耳机好。DirectSo u n d 所产生的效果是极其明显的,我试过播放一声音文件,用Win32函数PlaySo u n d 几乎占用了所有的CPU时间,使程序的其它功能完全丧失,而使用DirectSo u n d 后则对程序的其它功能影响微忽其微。 

DirectMusic 在DirectX6.1中被正式引入,它不同于DirectSo u n d 。DirectSo u n d 主要录制和播放的是.wav文件,即波形文件(实为采样声音文件)。Direct-Music播放的是音乐文件,例如MIDI 音乐、CD音轨。音乐文件与.wav文件的区别是音乐文件不像.wav文件一样可以放进声音缓冲区进行直接播放,音乐文件是按一定的格式存储的声音,如果想播放,还必须进行一定的转换。在DirectMusic产生以前,游戏中的背景音乐往往很难选择,MIDI 格式在不同的声卡上表现不一,读CD音轨时又不能访问光碟。DirectMusic相当于一个软硬兼施的波表合成器(如果硬件不支持,就用软件合成),可以将MIDI 之类的音乐文件转换成声音采样,然后传送给DirectSo u n d 播放(DirectSo u n d 的功能就是播放声音采样),从而在不同的环境下都可以正确地演奏出动人的音乐。DirectMusic还支持DLS标准(Downloadable Sounds,是MIDI Manufacturers Associ-ation推出的标准),它也可以播放符合DLS标准的文件,在以前,这可是只有在高级声卡上才能见到的功能。

在DirectX6.1的帮助文档中,可以看出微软推荐使用DLS标准。 Direct I nput 是对输入设备的支持,除了键盘、鼠标外,它还支持游戏杆。游戏杆是一个非常广的概念,我们平时玩游戏的小手柄是游戏杆,而一个复杂的汽车驾驶模拟装置也是一个游戏杆。在Win d o ws 编程中处理输入消息都是Win d o ws 干的,你按下一个键,Win-dows 接收到,再发送给程序,而DirectIn p u t 则越过了Win d o ws 的消息缓冲区,直接处理输入设备的输入。也就是说你按下一个键后,DirectInput将接收消息,由你自己去处理。 DirectPlay 为多人联网游戏提供了消息服务,同时还提供了启动和组织多人游戏的功能。再好的人工智能也比不上人的智能,在网络当道的今天,有哪个游戏不支持联网。又有哪个支持联网的游戏使用的不是DirectPlay。这主要是因为DirectPlay不考虑网络的传输介质,不管是用TCP /IP,IPX网还是用modem通过Internet的连接,DirectPlay都提供了相同的接口,这使得游戏通讯模块的编写容易了许多,并且又支持许多不同的网络,我们还有什么理由去拒绝DirectPlay呢? DirectSetup与AutoPlay 主要是使游戏的安装和使用更加方便,虽然这两个组件比其它的组件简单,但是它们所起的作用一点也不亚于其它的组件,因为“方便用户”是我们程序编写人员的最重要目标。

在我看来,DirectX的成功在很大程度上是因为DirectX的接口统一性,它使较小型的游戏软件公司有了更大的生存空间。在DOS 时代,每一个游戏开发者都得开发自己的显卡驱动程序以发挥不同显卡的优势。这样一来,小型的游戏软件公司往往很难跟上时代的步伐,当他们的游戏和驱动程序上市时,新的硬件已经上市了。若用DirectX开发,你就只用考虑游戏的设计而把驱动程序的设计留给微软或硬件开发商去做,当然,世界对微软的依赖又增加了许多。这样,当你的游戏用DirectX的某个版本开发,而DirectX的这个版本又支持比如AMD公司的3Dn o w。指令的话,那么你就可以宣称你的游戏针对AMD公司的CPU做过优化,实际上,大多数游戏公司可能也是这么做的。可以看出,DirectX的技术优势在于它的“直接访问硬件”,DirectX还有一个重要的优势———集成。也许(是“也许”)OpenGL的3D性能可以超过DirectX中的Direct3D,但它缺乏与Win d o ws 的集成,缺乏完成一个游戏必需的其它功能部件,并且我写这篇文章的时候我已经开绐怀疑到底是谁更好一些。微软的优势是集成,其实,集成确实很好,大多数的游戏公司也把DirectX当成了自己的游戏编程接口。

                                                                                                                    来源:电脑爱好者

你可能感兴趣的:(微软游戏编程接口———DirectX)