面向游戏开发人员的 DirectX 安装

本文旨在解决有关 DirectX 运行时的一些常见问题,并使用 DirectSetup 安装 DirectX。

重要

旧版 DirectX SDK 在生命周期结束时,但它仍可用以支持旧游戏、教程和项目。 新项目不应使用它。 使用旧版 DirectX SDK 需要对 D3DX9、D3DX10、D3DX11、XAudio 2.7、XInput 1.3 和 XACT 等组件使用弃用的 DirectSetup。 有关 DirectX SDK 当前状态的更多详细信息,请参阅 DirectX SDK 在哪里?,博客文章 不太直接安装程序

DirectX 运行时

DirectX 运行时由核心组件和可选组件组成。

核心组件(如 Direct3D 和 DirectInput)被视为作系统的一部分。 DirectX 9.0c 的核心组件自 DirectX SDK 夏季 2004 更新以来尚未更改,它们与 Microsoft Windows XP SP2、Windows XP Pro x64 Edition 和 Windows Server 2003 SP1 一起发布的组件相匹配。 Windows Vista 包括 DirectX 10,它支持 Windows 显示驱动程序模型(WDDM)和 Direct3D 10.x。 Windows 7 和 Windows Vista 支持 DirectX 11,它支持 Direct3D 11、Direct2D、DirectWrite、WARP10 软件呈现设备和 10level9 功能级别。 有关更多详细信息,请参阅 Windows 中的 图形 API。

可选组件在 DirectX SDK 的更新中发布,其中包括 D3DX、XACT、XAudio2、XINPUT、托管 DirectX 和其他此类组件。 许多可选组件会定期更新,以集成客户反馈并公开新功能。

DirectX 版本号

DirectX 版本号(如 9.0c)仅指核心组件的版本,例如 Direct3D、DirectInput 或 DirectSound。 此数字不包括 DirectX SDK 中发布的各种可选组件的版本,例如 D3DX、XACT、XINPUT 等。

一般来说,DirectX 版本号没有意义,只是作为对核心运行时位的快速引用。 不应使用此数字来检查是否已安装正确的 DirectX 运行时,因为它不考虑可选的 DirectX 组件。

DirectX 库

过去,DirectX SDK(包括 D3DX)的可选组件作为静态库发布。 但是,由于对更好的安全做法的需求增加,这些库现在作为类似于动态的库(DLL)发布。 DLL 允许维护以前发布的代码。 如果这些组件部署为静态库,则Microsoft无法解决发布后发现的安全问题。

随着功能添加到可选组件或更改,相应的 DLL 的名称也会更改,以确保不会对使用已发布组件的现有游戏造成任何回归。 每个组件的 DLL 并排运行,游戏开发人员可以通过链接到相应的导入库来准确选择游戏使用的 DLL 版本。

虽然确保 DLL 安装在系统上并不像直接链接到静态库那么容易,但对 DirectX SDK 进行了一些更改,以解决 DLL 模型的痛苦:

  • DirectX 可再发行组件可以配置为仅包含应用程序需要最大程度地减少分发和媒体大小的组件。
  • 每个可能的可选组件的可再发行文件、Program Files\DirectX SDK\Redist\, now contains a cabinet (.cab) 文件,因此无需挖掘较旧的 SDK 来查找它们。
  • 安装 SDK 本身会安装每个可能的可选组件。
  • 包含所有可选组件的 DirectX 可再发行组件作为基于 Web 的安装程序和可下载包提供;有关详细信息,请参阅 DirectX 开发人员中心(DirectX)。

由游戏安装程序安装 DirectX

下面是将 DirectX 安装添加到游戏安装程序的最佳做法:

术语 描述
每次安装可再发行组件。
游戏的安装过程应在每次安装期间安装 DirectX 可再发行组件,而无需允许用户选择退出它。 如果你允许选择退出,则某些用户会猜测他们不需要它,如果他们实际这样做,游戏将不会运行。
让 DirectX 安装程序检查可选组件。
不要假设系统上已安装最新的可选组件,因为 Windows 更新和 Service Pack 不提供任何 DirectX 的可选组件。 必须通过直接运行 dxsetup.exe 或调用 DirectSetup 来安装 DirectX 运行时。
静默设置。
以无提示模式启动设置,以便用户不会意外跳过更新 DirectX 运行时。 为此,可以使用以下命令启动 dxsetup.exe:
   path-to-redistributable\dxsetup.exe /silent
或者通过调用 DirectSetup 而不显示任何 UI。
合并 EULA 验收。
如果提示用户接受 EULA,请在以无提示模式进行安装时提示接受 DirectX EULA,以便提示接受 EULA 一次。 在安装任何内容之前,应发生提示,以便在用户不接受的情况下,最终不会安装失败和部分安装。
只需运行 dxsetup 或调用 DirectSetup。
由于 DirectX 版本号不引用除核心 DirectX 组件之外的任何内容,因此在运行 dxsetup.exe 或调用 DirectSetup 之前,请不要检查已安装的版本。 此外,请不要检查文件是否存在以测试是否已安装可选组件,因为通常无法正确确定组件是否存在但需要更新。 但是,DirectX 安装包将快速确定这一点,并执行正确的作。

小型安装包

可以通过将 DirectX 可再发行组件文件夹的内容条带化到使安装程序正常运行所需的最小文件集,并保留游戏使用的任何其他组件,从而为 DirectX 创建更小的安装包。

根据最低规格,你甚至可能不需要在安装介质的可再发行文件夹中包括核心 DirectX 9.0c 内阁文件。 大多数 Windows XP 安装都有 Service Pack 2,其中包括核心 DirectX 9.0c 组件,因此 DirectX 安装作非常快,不需要重新启动。 可以创建的最小包大约为 3 MB,可以压缩到大约一半的大小。 此类包包含 D3DX DLL 的一个版本,它要求 DirectX 9.0c 已存在。

生成可再发行包所需的最小文件集是位于 DirectX SDK Redist 文件夹(Program Files\DirectX SDK\Redist) 中的以下文件:

  • dxsetup.exe
  • dsetup32.dll
  • dsetup.dll
  • dxupdate.cab

添加到要安装的组件的内阁文件。 如果要求应用程序的用户已有 DirectX 9.0c,则无需包括 DirectX.cab 或 dxnt.cab,这构成了大部分空间要求。 仅 Windows 98 和 Windows ME 需要 DirectX.cab;仅 Windows 2000、Windows XP 和 Windows XP SP1 需要 dxnt.cab;windows 2000、Windows XP RTM、Windows XP SP1 和 Windows Server 2003 RTM 只需要 dxdllreg_x86.cab。 此外,如果不使用 DirectShow,或者假设它已安装,则可以省略 BDA.cab、BDANT.cab和 BDAXP.cab。

注意

可以假设应用程序的用户已安装 DirectX 9.0c(如果应用程序以前版本已安装),则强制用户通过 Web 安装程序手动更新,或者假设他们具有 Windows XP SP2 或更高版本。

继续本示例,如果仅在 2006 年 4 月使用 D3DX 的 32 位版本,则可以添加 Apr2006_d3dx9_30_x86.cab。 如果使用 2006 年 8 月 32 位 32 位版本的 XINPUT,请添加 Aug2006_xinput_x86.cab。

如果有本机 64 位应用程序,则需要添加_x64版本。 但是,如果 32 位应用程序在 64 位 OS 上运行,则 32 位版本的 DLL 将正常工作。

然后,可以在无提示模式下分发此文件包,并在无提示模式下启动 DirectSetup,或在命令行界面中以无提示模式运行 dxsetup.exe。 请记住不要通过文件的任何版本检查来保护此包,并确保用户无法选择退出运行 DirectX 安装程序。 其中任一事件都创建一个可删除的安装过程。

调试 DirectX 运行时的内部部署

安装 DirectX SDK 时会安装 DirectX 组件的调试运行时,但在每个测试计算机上安装 SDK 可能会很痛苦。 你需要设计设置过程,以便将调试运行时 DLL 从 Program Files\Microsoft DirectX SDK\Developer Runtime\architecture\ 复制到 Windows\system32\ 或游戏的文件夹。

但是,我们强烈建议不要简单地复制已发布的运行时 DLL,因为很容易忘记删除它们作为最终产品。 而是将 DirectX 安装程序文件放在共享文件夹中,并从共享文件夹以无提示方式运行安装程序。

桌面桥应用程序

使用 D3DX9 的桌面桥应用程序, D3DX10、D3DX11、XAudio 2.7、XInput 1.3 或 XACT 必须下载 Microsoft.DirectX.x86Microsoft.DirectX.x64 框架才能部署这些旧版 DirectX SDK 并行组件。 或者,可以删除所有这些依赖项(请参阅 XAudio 2.9 的可再发行版本的开发人员指南,以及没有 D3DX XINPUT 和 Windows 8的博客文章 Living)。