关于DirectX
DirectX是windows游戏设计中首选的API(应用程序接口)。在它没有出现之前,游戏开发人员的相当一部分时间是用来解决游戏与各种不同硬件的兼容性问题的,可以想象,那是非常痛苦的。但是现在,开发人员需要面对的仅仅是DirectX所提供的高效的,单纯的API。硬件兼容性问题?让微软和硬件驱动开发人员去解决吧。可以看到,随着DirectX技术的发展,市场上的windows游戏的数量以惊人的速度增长着。
你可以从本章内容了解到:
l DirectX 是什么
l DirectX 为什么有如此效果?
l DirectX API包括哪些组件?
DirectX是什么
DirectX是微软为游戏开发人员所提供的一套API集合,提供了对于硬件操作的接口,目前的最新版本为9.0。DirectX的各种组件分别提供了对于图像,声音,网络等各部分的支持。依靠DirectX所提供的标准接口,开发人员可以方便的对硬件进行操作而完全不必去理会具体的硬件是什么。
DirectX组件
DirectX是由多个部分组成的,分别对应着系统的不同方面。在你的程序中,你可以方便的调用任何一个API。
l DirectX Graphics 一切图像显示都是由它来实现的,它提供了2D和3D显示的API。
l DirectInput 提供对于用户输入的响应。它可以接受来自于键盘,鼠标,摇杆,手柄等的控制信息。最新版本中,提供了对于力反馈的支持。
l DirectPlay 它可以让你在游戏中加入网络功能,通过网络,和其他的游戏者互相合作或者竞争。DirectPlay提供了你能想到的网络部分应用的一切接口。
l DirectMusic 使用它可以使你在游戏中加入背景音乐或者音效 ,并变幻不同的效果。
l DirectShow 需要在你的游戏中加入过场音乐或者电影么?DirectShow可以满足你的要求,它可以用流模式播放本地媒体文件而不需要将其全部读入内存中来。
l DirectSetup 当你完成了你的游戏,并想将它发布给你的客户,DirectSetup会帮助你搜集所需要的DirectX组件并将其合并到你的项目中。
//DirectX Graphics组件包括了此前DirectDraw 和 Direct3D的全部函数,7.0版本以后的DirectX将不把DirectDraw作为一个独立的组件。
为什么需要DirectX
在Windows之前,所有的游戏都是基于DOS的,一个单线程,而且字符界面的操作系统。因此,开发者不得不在他们的应用程序中直接对硬件操作。 这种方法的优点就是,由于对于硬件的直接控制,程序可以最大程度的利用硬件资源,使软件可以达到硬件能表现出的最完美的效果;但它的缺点和优点同样明显,开发者将不得不为该软件所能用到的任何硬件重写驱动,正是因为如此,那个年代的软件一般都仅仅支持市面上最常见的硬件设备,比如说某些主流的声卡和显卡。
更令人头疼的是,在那个时候,声卡和显卡的标准并不统一,因此对于320x240以上分辨率的支持变的尤为困难。比如说,仅仅为了达到640x480的显示分辨率,开发者就不得不直接去操作显存以及显卡寄存器。
随后发布的Windows 3.1也存在着跟DOS下几乎同样的问题,因为此时的Windows操作系统,更像是一个运行于DOS下的应用软件,几乎不允许用户直接操作硬件,这也导致了那个时期的Windows游戏,基本上都以棋牌类游戏为主,动作类游戏还是把DOS作为他们的唯一平台。
Microsoft曾经开发过一套叫做WinG的运行库,可以使开发者更方便的操作显卡。可以说它是DirectX的前身,是一个不错的尝试。遗憾的是,它所提供的功能太有限,根本无法满足游戏开发的需要。
在经过了大量的准备工作后,Microsoft终于推出了DirectX 1,被称为游戏开发工具包(SDK)。它为游戏作者者提供了一个开发库,并以此在游戏和硬件之间搭建了所谓的中间平台,这样,在屏幕上显示图像的工作开始变得容易了。虽然这个版本的DirectX并不能支持所有的硬件,但它已经让游戏开发者们找到了他们一直以来所寻找的路,并看到了未来的方向。至今,DirectX已经经历了9个版本的更迭,并渐渐增加了对于网络,声音,以及多种输入设备的支持。
DirectX的构造模式
DirectX使windows下的游戏开发变的越来越简单,开发者可以从Microsoft得到大量的开发库。
这些年来,DirectX不断的升级以对更多的硬件提供更好的支持。Microsoft将DirectX设计为一种COM组件,以确保每个新版本的DirectX都能向下兼容,也就是说,那些在低版本下开发的游戏可以不经过任何修改就可以在新版本的DirectX正常运行。
组件对象模型
DirectX API是基于COM技术的。COM对象是一个接口集合,每个接口上都实现了各种方法并提供给开发者来使用。通常,COM对象的实体是以注册在系统中的dll的形式存在的。对于DirectX来说,它的注册过程已经在你安装它的时候完成了。对于COM组件来说,对方法的操作一定要通过接口来进行,这样的好处是你可以在COM组件中同时存在同一个接口的不同的版本,从而达到后向兼容。
也就是说,每个版本的DirectX都会添加新的DirectDraw接口,旧的接口依然保留,这样就不会破坏之前的代码的完整性。基于DirectX 7的游戏运行在Direct9环境下依然可以访问同样的接口。
COM技术的另外一个优点就是语言无关性。每个开发者都可以用他们所熟悉的语言来开发游戏,无论是C++ , Basic ,或是C#。
DirectX的结构
DirectX由两层构成,API层以及硬件抽象层(HAL),API对于硬件的操作都是通过HAL进行的。HAL对DirectX提供了一套标准的接口,使其可以通过硬件的驱动直接操作硬件。因为HAL需要对硬件的工作方式有着充分的了解,所以它一般是由硬件生产厂商来完成的。你永远都不需要直接对HAL做任何的操作,DirectX提供了函数可以让你间接的访问它。HAL层与硬件层以及DirectX的关系如图1.1所示。
游戏程序
↓
Direct3D API
↓
HAL
↓
设备驱动接口
↓
显卡
在早期的版本中,除了HAL以外,还有一个设备模仿层(HEL),它可以软件模仿3D硬件的效果。这样可以让高端的显卡和低端的显卡在DirectX API中实现同样的功能,虽然效果的优劣并不一样。因为HEL的任何效果都是软件运算所产生的,所以使用此技术的后果就是游戏的祯率远低于那些使用硬件加速的。
目前HEL技术已经基本被一些应用程序插件所替代。应用程序开发者会自己负责这部分以达到软显卡的效果。因为由于3D显卡的普及,基本上市面上所有的游戏都是采用3D硬件加速了。
//Direct3D 设备驱动工具(DDK)可以用来开发“软设备”以模拟硬件设备。
本章小节
你已经了解了DirectX的技术内幕以及它所能带来的优点。跟着下来,你将开始你的第一个DirectX 程序。