
【精品】1Direct基础.doc
9页1. Direct 基础Microsoft Direct应用程序接口(API)发展的冃的,是为了要提供一组接口,让执行 Microsoft Windows操作系统的计算机能很有效地学控多媒体硬件Direct让程序设计人 员可以使用井常接近硬件内部处理指令和数据架构的方法,却不需耍太过低阶到必须针对不 同装置撰写不同的原始码程序设让人员只耍撰写罪装置相依性的原始码,就可以开发出永 远最佳化的软件一即使是使用者为了改善系统效能而增加了更好的3D图形加速卡、声卡、 输入装置等等Direct的设计理念是耍让开发人员拥有一个类似MS-DOS效能的环境,而速度远快于 Windows-based程序代码,I大I为早期的Windows多媒体API包含了不必耍的系统负担然 而,由于支持了所有可运用的硬件特性,Direct的程序代码执行速度甚至比多数的MS・ DOS应用程序还快Direct API是架构在一种可以忽略便件装置依赖性的硬件抽象层(hardware abstraction layer, HAL)上也因为Direct是针对未来的扩充性所设计,所 以很多现有硬件还无法支持Direct所运义的许多硬件加速支持特性。
这种特性会由硬件仿 真层(hardwareemulation layer, HEL)來模拟,如果当HEL无法支持时则予忽略当某 种能加速Direct功能(例如进阶纹理)的装置出现时,您便可以用它來取代旧的装置,而 您所开发的前瞻性软件就会立刻运用新装置所支持的加速特性当您针对某种装置建立一个Direct对象时,Direct会口动向硕件(也就是HAL)杳询关 于这个装置的信息这些信息会填入一个叫特性位(cap bits)的表格中(特性位是功能位(capabilitybits)的缩写)特性位中的信息可以用來决定某种特定动作是由锁件本身能执 行或是耍用HEL去模拟即使Microsoft提供了特性位让您可以决沱锁件(HAL)中提供哪些特性或是哪些必须经由 软件(HEL)仿真,您还是应该圧义出一套能接受的最低系统组态,并且让您的稈序代码最 佳化,让程序在这种最低系统上也能尽可能有效率地执行换句话说,非万不得已不去使用 HEL,同时您应该在HEL的影响性最小的前提下去开发应用程序如此就能利用目标系统 上更强大的硬件支持的进阶功能,而不会迁就这种最低配备这样就能在游戏中让那些拥有 功能强人的系统玩家提供许多加强的功能,如进阶贴图、较复杂的多边形,或是动态光源 等。
不过您得确圧在设计上必须尽可能地充分运用进阶的特性记住,硬件的处理能力进步 越來越快,同时游戏的狂热分子也会不停地更新他们的系统,如果您在设计软件时不向前思 考,势必将失去可观的销ftfioDirect APIDirect API包含了数种API,这些API是设计来合并使用并协助您开发3D多媒体游戏及 仿真(以及英它许多的IK 3D应用程序)它提供功能的函式库來执行2D及3D的成像; 标准及3D音效、音乐、支持键盘、游戏杆,及英它的输入装置(包括力冋馈硬件)、网络 游戏这些接口相互结合可以提供一组强大并整合的指令函式库,让您可以有效地创造出优 越的游戏及仿真程序目前在 Direct 中已提供的 API W DirectDraw. Direct3D、DirectMusic、DirectSound、 DirectPlay> Directlnput,以及DirectSetup在本书及随书光盘的程序代码中,将会告诉您 如何去整合其中的数种 API —DirectDraw、Direct3D、DirectSound、DirectPlay,以及 Directlnput—来完成一个焦点放在第一人称角度的3D游戏类应用程序。
DirectDrawDirectDraw API提供显示装置的处理、点阵数据的控制、屏幕外内存,及快速存取英它硬 件特性(如图块搬移、切换页)它同时也是Direct3D的基本架构在第三章,本书还会 提到所有关于耍建立一个Direct3D的应用程序时所必须了解的DirectDraw特性您川以运 用这里的原始码作为您所开发的3D游戏架构如果您愿意,您也可以运用DirectDraw* 身來开发2D游戏;然而这里不会描述如何用DirectDraw去开发2D游戏,因为本书的重点 是在3D游戏上Direct3DDirect3D是本书的重点,它是一种可以用3D图形及利用3D指令的破件加速特性优点來撰 写程序的APL儿乎所冇市售的绘图卡都支持3D加速,这对个人计算机上的3D绘图应用 的革新來说是极其重大的几乎所有Windows上的3D游戏都是用Direct3D所完成的当Direct3D刚出现时,它提供二种API:立即模式(Immediate Mode)和Retained模 式立即模式(命名由來是因为对彖的绘制会在指令启动时立即发生)较不易使用,但却是 弹性较人,较低阶的API,在开发游戏时也会执行得较有效率。
Retained模式(命名由来 是因为API会先存入影像数据库中再一次全部绘制成像)则是架构在立即模式的上一层, 用来提供附加的功能,如贴图管理、对象档案加载、框架阶层,及动画Retained模式比 立即模式易学易用,但是稈序设计帅需求的还是立即模式所能提供的效率及弹性Retained 模式API的开发在Direct 6时已经中止,Direct3D则把重心放在改善立即模式API的威力 及易用程度上Retained模式并不支持重要的新技术,如多重贴图(multiteturing).凹 凸对映(bumpmapping),或硬件转换及打光(lighting),所有未来的3D程序都应该用 立即模式开发,本书也是完全针对立即模式的API而来,一冃您读完了这本书,您将可以 对立即模式的细微差异有充分的了解,而且您可以知道如何整合英它的Direct來建立强大 的3D游戏DirectMusic这种Direct的API是用来处理message-based的音乐数据,并透过硬件或软件合成器来 转换成波形取样数据(wave samples)预设的软件作法是采用Microsoft Software Synthesizer来建立波形取样数据,并串流给DirectSoundo乐器的声音则是根据 Downloadable Sounds (DLS)标准从取样资料中合成而来。
DirectMusic也包含■个组合 引擎,可以依据所提供的特定规则立刻组合出音乐DirectSound这类API提供了有效率的立体声及3D音效处理,包含内存管理及硬件音效混音DirectSound完全使用了系统硬件的优点将3D的音效整合入所开发的游戏及仿真程序是 一个好的想法,I大I为如此将增加应用程序的真实度听到声音来白您的左方、右方、上方一 也就是四面八方一可以使得环境更加吸引人,尤英是当您正利用DirectPlay与对手进行对战 时更是如此DirectPlayDirectPlay可以管理多人游戏并且启动与传输尤关的联机动作及讯息服务游戏玩家老早就 希望那些优良的第一人称游戏可以支持网络联机、调制解调器联机,甚•至二者同时目前有 许多最受欢迎的游戏都已提供这些功能,玩家也了解到多人游戏(head・to・head play)远 比单人或和计算机对玩有趣的多许多企业也I大I此得到了教训一在他们的网络变得拥塞, 以至于必须禁止员工在办公室中玩这类游戏之后!)我建议您,如果想在游戏市场上获得成 功,记得在任何第一人称游戏中加入网络联机游戏功能在第十五章,您会看到所有关于游 戏如何透过网络、因特网或调制解调器來连到主机的DirectPlay程序代码。
Di recti nputDirect API针对几乎所有的输入装置提供了低阶的输入功能支持Direct 7针对不同的装 置提供了力冋馈(force-feedback)功能的支持,包括方向盘及游戏杆力冋馈装置可以仿 真某些感知状况,如路啲突起的后座力、飞行时的风速切力,以及船航行时的水而波动DirectSetup这类的API负责处理Direct的口动安装人多数的系统己经安装了 Direct,但是对还没 安装的系统而言,DirectSetup提供了一套口动的步骤來安装应用程序需耍的Direct执行 时期组件因为Microsoft同意免费提供Direct,开发人员可以在软件中加入判断,当 Direct不存在或版本过旧时重新予以安装Microsoft在Direct 7 SDK的DRredist冃录 下提供了 Direct执行时期组件,本书的随书光盘也有附上记住,Direct执行时期组件 的用途必须受到 DRredist\license\Direct end user eula.tt 档案中的 End-User License Agreement 所限制Direct3D 在 Direct API 中的角色Direct3D最早出现在1996年的Direct 20中,在它出现后没多久,Direct3D就变成市场 上最受欢迎的3D API。
许多的游戏及仿真程序都运用它,并且儿乎所有的3D加速绘图卡 都支持它目前开发的硬件加速功能可以在绘图卡上做到每秒产生数百万个多边形的效率, 价钱约在美金100到200元之间只不过在不久前,这种速度只能在价值数千美元的碾件 上才做的到像这样结合了 Direct3D的加速卡己经人幅地增加速度并显著的降低了 3D应 用的成本高效率不再意味着必须付出高成本如同所有的Direct API 一样,Direct3D不仅仅是用来提供开发人员一个共同的API作为游 戏开发时的未來延伸之用,同时也完全兼顾了向后的兼容性所有运用早期版本的Direct 所开发的游戏也都可以在未来的Direct版本下正常执行Direct3D应用程序搭配图形加速 帳件时,在立即模式和Retained模式下的表现类似我们之前提过,他们都是尽可能地透 过HAL來使用硬件一要不然便使用HEL因为Direct3D扮演着DirectDraw对象接口的角 色,Microsoft 通常把这种 HAL 称为 DirectDraw/Direct3D HAL图 说明 了 Direct3D 如 何在Microsoft Win32环境以及可用的硬件加速卡下运作。
图1-1 Direct3D与Direct环境和系统的关系在使用Direct API前必须知道的事耍冇效地使用Direct API,您必须了解儿个关键概念:如何使用组件对象模型(Component Object Model: COM)、使用 Add Ref 及 Release 方法、知道用 C 和 C++呼叫 Direct 方法 的差异,以及管理Direct传冋值我们会在本章的下半段提到这些主题何谓COM物件?—个COM接口就类似于在C++中的抽象类别(abstract class)就如同C++抽象程序代 码类别并不实际与程序代码结合一样,COM接口主要是用来描述一些符号和语意,但不包 括实体部分COM接口及单纯的虚拟函式使用了一个称为viable的装置这个装置中记录 着用來开发接口的函式(也称为方法)的地址耍产生一个能使用COM接口方法的对象, 您可以呼叫Queryinterface方法来确保对象的接口存在并取得连到该接口的指针您可 以利用呼叫Queryinterface方法所传冋的vtable的指针再去呼叫对象产生接口的方法程序设计人员会透过数种COM对象来引用Direct的特性每一种对象的接口都代表了某 种装置,例如IDirectDraw7则是直接从IUnknown COM接口衍生而来。
这些对象是利用每 个对象的动态。
