DirectX软件开发包是微软公司提供的一套在Windows操作平台上开发高性能图形、声音、输入、输出和网络游戏的编程接口。微软将DirectX定义为“硬件设备无关性”,即使用DirectX可以用与设备无关的方法提供设备相关的(高)性能。
事实上,DirectX已经成为一种标准,它可以为应用程序(特别是游戏)开发人员和硬件厂商之间的关系“解耦”。DirectX标准的建立,可以为硬件开发提供策略,硬件厂商不得不按照这一标准进行产品改进;同时,通过使用DirectX所提供的接口,开发人员可以尽情地利用硬件可能带来的高性能,而无需关心硬件的具体执行细节。
另外,DirectX采用了组件对象模型(COM )标准,因此不同对象的版本可以有不同的接口,这使用DirectX开发的程序即使在未来也能得到完全的兼容和支持。
DirectX是一项卓越的技术。那么,它为什么称为DirectX呢?其实也不难理解,Direct 是直接的意思,X可以代表很多东西,合在一起就是具有共性的一组东西(这个共性就是直接)。DirectX是一个大家族,并且随着DirectX版本的不断更新,家族成员也在不断地发展壮大。
下面是DirectX 9.0家族的所有成员:
DirectX Graphics:集成了以前的DirectDraw和Direct3D技术。DirectDraw主要负责2D加速,以实现对显卡内存和系统内存的直接操作;Direct3D主要提供
三维绘图硬件接口,它是开发三维DirectX游戏的基础。
DirectInput:主要支持输入服务(包括鼠标、键盘、游戏杆等),同时支持输出设备。
DirectPlay:主要提供多人网络游戏的通信、组织功能。
DirectSetup:主要提供自动安装DirectX组件的API功能。
DirectMusic:主要支持MIDI音乐合成和播放功能。
DirectSound:主要提供音频捕捉、回放、音效处理、硬件加速、直接设备访问等功能。
DirectShow:为在Windows平台上处理各种格式的媒体文件的回放、音视频采集等高性能要求的多媒体应用,提供了完整的解决方案。
DirectX Media Objects: DirectShow Filter的简化模型,提供更方便的流数据处理方案。
DirectX9.0 SDK提供了一个程序设计框架,本教程的例子中需要使用这些框架。可以在DXSDK9\Samples\C++\Common目录中到这些文件。通过文件是你可以直接访问你所需要的东西,同时封装了设置Direct3D的细节,这对于你的学习很有帮助。因为你可以集中精力与本质的内容,同
时还能看到所有最底层的东西。该框架提供了一个通用的平台,让你可以实现自己的专用功能。作为一个初学者,可以通过这个快捷的、经过良好测试的框架代码来避免许多基本的错误,从而使你能更专注于学习实质的内容。
COMwindows开发平台
COM(Component Object Model)对象是一组特定功能的抽象集合,应用程序不能直接访问COM对象,而是必须通过对COM对象的接口(Interface)的指针执行COM对象的功能。如果你用过微软的其他API,如果那些使用经历已经使你成为一个COM老手,那你可以跳过这一节。而剩下的人则必须投入一些精力来学习COM。DirectX从一开始就采用COM接口,通过学习使用COM的方法,你将会有很大的收获。
在COM术语中,一个软件组件(component)就是一大堆通过接口提供服务的代码,而接口则是一组相关的方法。一个COM组件通常是一个.DLL(Dynamic Link Library动态链一接库)文件,这个.DLL文件可通过一种一致具既定的方式来访问。说完了……,它听上去不像是需要用上千页纸来阐述的问题,不是吗?
COM有许多优点。我想强调3点,那些是我认为对于像我们这样的Direct3D程序员而言比较重要的:
COM接口永远不会改变;
COM是独立于语言的(language-independent):
只能访问一个COM组件的方法,而不是它的数据。
C++和许多其他语言都是基于源代码(source-based)的,因此,它们没有一个版本策略。COM被设计为一种基于二进 (binary-based)的编程模型,并且COM接口永远无法通过任何方式来修改。
举一个例子来说明为什么需要COM吧。设想这样的情况,一个非COM的DLL A是由软件公司C开发的,另一个非COM的DLL B是由软件公司D开发的。只要两家公司都没有改变DLL的接口,那么DLL A和B便能互相兼容。但如果公司D改变了DLL B的接口,那么它就不能再与DLL A相兼容了,除非公司C对DLL A的接口作出相应的变更。
这种情况不会发生在一个COM DLL身上。当COM对象被更改,一个新命名的全新接口将会添加到DLL中。因此,每个COM DLL都必须支持自它发布以来所有的接口。若上述情况中的两家公司都使用COM DLL,对DLL B接口的一个更改就会导致一个新的接口附加到B中。由于B有了两个接口,所以DLL A仍能够连接上旧的接口。
这便是DirectX实现其接口的方法。Direct3D 9.0或DirectX Graphics支持以下接口: IDirect3D
IDirect3D2
IDirect3D3
IDirect3D7
IDirect3D8
IDirect3D9
表 2.1显示了这些接口对应的DirectX版本。
DirectX版本接口
DirectX2 Idirect3D
DirectX3 Idirect3D2
DirectX6 Idirect3D3
DirectX7 Idirect3D6
DirectX8 Idirect3D8
DirectX9 Idirect3D9
此书编写时最新版本的DirectX支持从IDirect3D到IDirect3D9的接口。这意味着用IDirect3D2的老游戏依然可以在当前硬件上运行,因为最新版本的DirectX仍支持此接口。换句话说,若一家公司开发了一款与Windows NT4.0兼容的游戏,而Windows NT 4.0只支持DirectX 3.0 SDK的IDirect3D2接口,那这家公司将只能使用IDirect3D2接口来完成所有的工作。自从DirectX 3.0开始,每个版本的Direct3D DLL中都实现了IDirect3D2接口,并且会继续在将来的版本中实现。上述的游戏就可以在所有具有DirectX 3.0以上版本运行时的平台上运行了。
COM是独立于语言的。无论你偏爱的语言是Visual Basic, Pascal还是其他语言,你都可以用偏爱的编译器程序包来访问COM对象。Delphi用户尤其喜爱这个特点,但自从DirectX7.0问世以来,Visual Basic的倡导者们也已在所有DirectX SDK中提供了一个他们自己的良好实现。当将游戏中的某些部分如世界编辑器(world editor)用Delphi编写,而其他部分(或许是游戏世界中不同的地方)用Visual C++编译器编写,独立于语言的作用便体现出来了。
COM只能通过方法来访问,而不能直接访问数据对象。从面向对象的角度看,这是一个很好的设计。正如你在下一章中将要看到的,不能直接去掉用一个方法,而是需要通过一个名为v-table或VTBL的虚函数表来进行两次间接调用。这些v-table同时也成为一个独立于语言接口的关键。有了这些优点,COM可助你做到语言无关,并能保证访问过去和现在版本的Direct3D接口。
COM组件有3种类型:进程内组件、本地进程组件和远程组件。接下来看一下怎么实现一个COM组件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论