DirectX 8开发人员常见问题

  1. 目 录
  2. General
  3. Direct3D
  4. DirectSound
  5. DirectPlay

本文对与Microsoft DirectX 8.0版有关的常见开发问题进行解答,其中包括有关Direct3D、DirectSound及DirectPlay的章节。


1、一般性DirectX开发事宜

问:我在试图编译示例时,为何得到那么多错误消息?

:您可能没有将 include 路径设置正确。许多编译器(Microsoft Visual C++)包含 SDK 的一个较早版本,因此如果您的 include 路径首先搜索标准的编译器 include 目录,则您会得到不正确版本的头文件。为解决这一问题,请确保 include 路径和库路径被设为搜索 DirectX include 和库路径。另请参见 SDK 中的dxreadme.txt 文件。如果您安装 DirectX SDK 而您又在使用 Visual C++,则可以选择让安装程序为您设置各个 include 路径。

问:我得到关于全局唯一标识符(GUID)符号重复或缺失的连接器错误,怎么办?

:您使用的各种 GUID 应该得到一次性定义,且只能定义一次。如果您在插入 DirectX 头文件之前用 #define 定义 INITGUID 符号,则会插入 GUID 的定义。因此,你应确保只对一个编译单元进行此类操作。这一方法的一个替代方案就是用 dxguid.lib 库进行连接,其中包含所有 DirectX GUID 的定义。如果您使用这一方法(建议),则您永远不要通过 #define 定义 INITGUID 符号。

问:我能否将指针指向一个到较低版本号的 DirectX 接口?

:不能。DirectX 接口属于 COM 接口 。这意味着不要求将较高版本号的接口从相应的低版本号导出。因此, 获得到 DirectX 对象的一个不同接口的唯一安全方法就是使用接口的 QueryInterface 方法。该方法是标准的 IUnknown 接口的一部分,所有 COM 接口必须从其导出。

问:我能在同一应用程序中将 DirectX 8 组件和DirectX 7 或更早的组件混用吗?

:您可以随意混用不同版本的“不同组件”;例如,您可以在将 DirectPlay 8 和 DirectDraw 7 用在同一应用程序中。但是,您通常不可以将“同一组件”的不同版本混用在同一应用程序中;例如,您不能混用 DirectDraw 7 和 Direct3D 8 (鉴于这些实际上是同一组件,因为 DirectDraw 已被含入 DirectX 8 的 Direct3D)。

问:Release 或 AddRef 方法的返回值有何含义?

:返回值将是对象的当前参照计数。但是,COM 规范声明,您不应依赖该返回值;该值通常仅供用于调试目的。您观察到的值可能并非所期待的,因为各种其它系统对象可能保持着对你所创建的 DirectX 对象的参照。因此,您不应编写反复调用 Release 的代码,一直到参照计数为零,因为此时可以将对象释放,即使另一组件可能仍旧在对其进行参照。

问:我释放 DirectX 接口的次序很重要吗?

:应当没有问题,因为 COM 接口是参照计数的。但是,在某些 DirectX 版本中,接口的释放次序有一些已知的缺陷。安全起见,在可能的情况下,建议您以与创建时相反的次序释放接口。

问:智能指针是什么,我要用它们吗?

:智能指针是一个 C++ 模板类,旨在封装指针功能。尤其有一些标准智能指针类,用于封装 COM 接口指针。这些指针自动进行 QueryInterface,而不是进行造型,并替您处理 AddRef 和 Release。您是否使用这些指针,大体上是个人偏好。如果您的代码包含大量的接口指针复制操作,即使用多重 AddRefs 和 Releases,则智能指针可能会使您的代码更加简洁和不易出错。否则,不用也罢。Visual C++ 包含一个标准的 Microsoft COM 智能指针,是在 "comdef.h" 头文件中定义的(请在帮助中查找 com_ptr_t)。

问:我在调试 DirectX 应用程序时遇到问题,能提示一下吗?

:调试 DirectX 应用程序时最常见的问题就是试图在 DirectDraw 表面被锁定时进行调试。这一情形会在 Windows 9x 系统上导致 “Win16 Lock”,因此而无法绘制调试窗口。在锁定表面时指定 D3DLOCK_NOSYSLOCK 标志,通常会消除该现象。Windows 2000没有这一问题。在开发一个应用程序时,最好运行调试版本的 DirectX 运行时(在安装 SDK 时进行选择);该版本进行某些参数证实, 并将一些有用的消息输出到调试程序的输出窗口。

问:如何正确地检查返回代码?

:使用 SUCCEEDED 和 FAILED 宏。 DirectX 方法可以返回多个成功和失败代码,因此一个简单的“==D3D_OK”或类似的测试结果不总是够用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值