面向游戏开发人员的 Direct3D 11 部署
本文介绍如何在必要时在系统上部署 Direct3D 11 组件。
- 概述
- Direct3D 11.3
- Direct3D 11.2
- Direct3D 11.1
- D3D11InstallHelper.dll
- D3D11Install.exe
- 集成到安装程序中
- 调试提示
- 公司设置
- 相关文章
概述
Direct3D 11 API 扩展了现有的 Direct3D 10.1 API,支持多线程渲染和资源创建、计算着色器、硬件细化、BC6H/BC7 纹理压缩和具有动态着色器链接的 HLSL 着色器模型 5.0。 除了 Direct3D 11 组件外,DirectX 11 运行时还包括一些其他图形组件:Direct3D 11、DXGI 1.1、10level9 功能级别、WARP10 软件呈现设备、Direct2D、DirectWrite,以及支持 10level9 和 WARP10 的更新 Direct3D 10.1。 有关这些组件和其他 Windows 图形组件的信息,请参阅 Windows 中的图形 API。
所有这些新的图形组件都内置于 Windows 7 和 Windows Server 2008 R2 操作系统中。 也可以使用来自 Windows 更新 的系统更新在 Windows Vista 上安装 Direct3D 11 API 和相关组件。 此更新需要 Windows Vista 和 Service Pack 2。 因此,启用自动更新的最终用户可能已安装 Direct3D 11 组件,所有 Windows 7 用户也已安装。
D3D11InstallHelper 示例旨在简化 Direct3D 11 API 的检测,自动安装系统更新(如果适用于最终用户的计算机),并在需要更新的 Service Pack 时手动向最终用户提供适当的消息。
注意
HLSL 编译器 (D3DCompile*.dll) 和适用于 Direct3D 11 (D3DX11*.dll) 的 D3DX 实用工具库未内置到任何版本的 Windows 操作系统中,但可以使用现有的 DirectSetup 技术将其部署为应用程序的安装程序的一部分;有关使用 DirectSetup 的详细信息,请参阅 面向游戏开发人员的 DirectX 安装。 “Effects 11”作为 Direct3D 11 更新效果的共享源支持库提供,你可以将其直接包含在应用中, (非常类似于 DXUT 实用工具库) 。 因此,它没有任何额外的运行时重新分发要求。
Direct3D 11.3
Windows 10随附了内置的 Direct3D 11.3 API。 有关 Direct3D 11.3 API 中的新功能列表,请参阅 Direct3D 11.3 功能。
Direct3D 11.2
Windows 8.1和 Windows Server 2012 R2 随附了内置的 Direct3D 11.2 API。 有关 Direct3D 11.2 API 中的新功能列表,请参阅 Direct3D 11.2 功能。
Direct3D 11.1
Windows 8和Windows Server 2012随附内置 Direct3D 11.1 API。 安装了适用于 Windows 7 的平台更新 的 Windows 7 或 Windows Server 2008 R2 上提供了对 Direct3D 11.1 API 的部分支持。 有关 Windows 7 平台更新的详细信息,请参阅 适用于 Windows 7 的平台更新。
D3D11InstallHelper.dll
D3D11InstallHelper.dll承载用于检测 Direct3D 11 组件以及通过 Windows 更新 服务执行系统更新(如果适用)的核心功能。 DLL 不直接显示任何消息或对话框。
DLL 由以下入口点组成:
-
CheckDirect3D11Status
-
此函数执行必要的检查,并返回此计算机上的 Direct3D 11 状态。 此函数不需要管理员权限。
- 状态为 D3D11IH_STATUS_INSTALLED指示计算机上已安装 Direct3D 11 并可供使用。
- D3D11IH_STATUS_NOT_SUPPORTED表示此版本的 Windows 不支持 Direct3D 11 或相关技术。
- 状态为 D3D11IH_STATUS_NEED_LATEST_SP 指示用户应安装最新的 Windows Vista Service Pack。
- 最后,D3D11IH_STATUS_REQUIRES_UPDATE状态指示系统未安装 Direct3D 11,但系统更新适用于此版本的 Windows。
-
DoUpdateForDirect3D11
-
此函数使用 Windows 更新 API 执行系统更新,以便在此系统上安装 Direct3D 11(如果适用)。 请注意,此函数需要网络连接才能Windows 更新成功,以及管理权限。 它采用可选的进度回调函数和用户上下文指针,并在完成后返回最终结果代码。
- D3D11IH_RESULT_SUCCESS结果指示系统更新已应用并可供使用,而D3D11IH_RESULT_SUCCESS_REBOOT指示系统更新要求计算机在完成之前重启。 请注意,此函数不会计划系统重启。
- D3D11IH_RESULT_NOT_SUPPORTED指示系统更新不适用于此版本的 Windows。 如果仅在从 CheckDirect3D11Status 获取D3D11IH_STATUS_REQUIRES_UPDATE状态后调用此函数,则不应发生此结果。
- D3D11IH_RESULT_UPDATE_NOT_FOUND的结果指示在Windows 更新服务器上找不到系统更新包。
- 如果下载或安装Windows 更新失败,则将返回D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED或D3D11IH_RESULT_UPDATE_INSTALL_FAILED作为结果。
- 如果从 Windows 更新 API 返回网络连接错误,则返回D3D11IH_RESULT_WU_SERVICE_ERROR结果,指示问题可能是间歇性的,或者与网络配置或防火墙设置相关。 再次尝试更新函数可能会成功。
有关 Windows 更新 API 的详细信息,请参阅 Windows 更新 代理 API。
D3D11Install.exe
注意
D3D11Install.exe需要执行D3D11InstallHelper.dll。
D3D11Install.exe是一种工具,用于将 D3D11InstallHelper.dll 用作独立安装程序,其中包含 UI 和最终用户消息,并充当正确使用 DLL 的示例。 如果已安装 Direct3D 11、系统更新成功应用而无需重启系统、需要安装 Service Pack 或此计算机不支持 Direct3D 11,则进程退出并显示 0。 如果系统更新应用成功且需要系统重启才能完成,则返回 1。 对于其他错误条件,返回 2。 请注意,此可执行文件需要管理员权限才能运行,并且它具有一个清单,当在启用了 UAC 的 Windows Vista 或 Windows 7 上运行时,该文件请求提升。 D3D11Install.exe可用作部署 Direct3D 11 更新的独立工具,也可以由安装程序直接使用。
它支持以下命令行开关:
-
/安静
-
不显示任何消息、提示、进度对话框或错误消息。
-
/被动
-
不显示任何消息、提示或错误消息,但将显示进度对话框。
-
/最小
-
仅显示最少的提示。
-
/Y
-
对于标准和最小安装,取消提示确认安装更新(如果需要且适用)。
-
/langid decimal
-
强制在显示最终用户消息和对话框资源时使用的语言标识符代码。 默认值为 1024,它使用系统默认语言设置。
-
/五
-
强制使用Windows 更新而不是系统默认值,这可能Windows Server Update Services (WSUS) 在托管服务器或其他一些非标准配置上运行。
集成到安装程序中
为了遵守适用于 Windows 的游戏的“支持轻松安装 ”技术要求 3.1,需要小心谨慎,以便在安装过程的早期显示任何最终用户提示,并确保不存在多个与 UAC 相关的提升提示。 实现此目标有三个基本选择:
- 最基本的方法是使用命令行开关 /minimal 执行D3D11Install.exe。 这应在安装程序 Q&A 的早期完成,并且安装应使用返回值 1 来指示应在安装结束时计划重启。 执行程序需要管理权限。
- 直接使用 D3D11InstallHelper.dll 检测更新需求,提供状态D3D11IH_STATUS_NEED_LATEST_SP所需的任何最终用户消息,其中解决方法需要手动用户操作。 D3D11IH_STATUS_NOT_SUPPORTED的状态结果可用于控制与 Direct3D 11 相关的资产的安装,或用作仅限 Direct3D 11 的应用程序的错误条件,但它不一定是有用的最终用户消息。 对于状态D3D11IH_STATUS_REQUIRES_UPDATE,安装程序可以直接使用 DLL 入口点 DoUpdateForDirect3D11 来执行更新并处理生成的各种最终用户消息。 通过检查“D3D11Install.exe”对话框和字符串表资源,可以找到标准消息的示例。 更新入口点需要管理员权限。
- 混合方法是使用 D3D11InstallHelper.dll 检查状态,在状态代码D3D11IH_STATUS_NEED_LATEST_SP或D3D11IH_STATUS_REQUIRES_UPDATE的情况下,可以使用开关 /minimal 和 /y 执行D3D11Install.exe以显示对话框或根据需要执行更新。 这些步骤应在安装过程的早期执行,通常在 Q&A 之后立即执行,运行可执行文件需要管理权限。
集成到 InstallShield
使用 D3D11InstallHelper 示例可以轻松地从 InstallShield 的 InstallScript 处理 Direct3D 11 部署。 使用 InstallScript 与 InstallShield 集成所需的步骤如下 (方法 3,如上一节) 所述:
在 InstallShield 编辑器中打开 InstallScript 项目。
将D3D11InstallHelper.dll和D3D11Install.exe添加到 支持文件中的项目。
将文件添加到 InstallShield 项目
- 在“安装Designer”选项卡上,单击左侧导航窗格中“行为和逻辑”下的“支持文件/广告牌”。
- 单击“ 独立于语言”,然后在“ 文件 ”窗口中右键单击并选择“ 插入文件”。 浏览以添加D3D11InstallHelper.dll和D3D11Install.exe。 这些文件的默认位置为:SDK root\Samples\C++\Misc\Bin\x86
在 InstallScript 资源管理器中,单击将调用 DLL 或可执行文件的 InstallScript 文件 (通常为 Setup.rul) ,该文件位于左侧导航窗格中 的行为和逻辑 下。
将以下 InstallScript 粘贴到靠近顶部的 文件中:
#define D3D11IH_STATUS_INSTALLED 0 #define D3D11IH_STATUS_NOT_SUPPORTED 1 #define D3D11IH_STATUS_REQUIRES_UPDATE 2 #define D3D11IH_STATUS_NEED_LATEST_SP 3 #define D3D11IH_STATUS_ERROR -1 原型编号 D3D11InstallHelper.CheckDirect3D11StatusIS () ;
#define D3D11IH_RESULT_SUCCESS 0 #define D3D11IH_RESULT_SUCCESS_REBOOT 1 #define D3D11IH_RESULT_NOT_SUPPORTED 2 #define D3D11IH_RESULT_UPDATE_NOT_FOUND 3 #define D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED 4 #define D3D11IH_RESULT_UPDATE_INSTALL_FAILED 5 #define D3D11IH_RESULT_WU_SERVICE_ERROR 6 #define D3D11IH_RESULT_ERROR -1 原型编号 D3D11InstallHelper.DoUpdateForDirect3D11IS (BOOL) ;```
将以下 InstallScript 粘贴到 OnFirstUIBefore 函数的 文件中,紧靠在返回 0 之前:
Dlg_D3D11: UseDLL( SUPPORTDIR ^ "D3D11InstallHelper.DLL" ); nResult = D3D11InstallHelper.CheckDirect3D11StatusIS(); UnUseDLL( SUPPORTDIR ^ "D3D11InstallHelper.DLL" ); if ( nResult = D3D11IH_STATUS_REQUIRES_UPDATE || nResult = D3D11IH_STATUS_NEED_LATEST_SP) then nResult = LaunchAppAndWait( SUPPORTDIR^"D3D11Install.exe", "/minimal /y", WAIT); if ( nResult < 0 ) then MessageBox("Unable to launch D3D11Install.exe", SEVERE); elseif ( nResult == 1 ) then BATCH_INSTALL = 1; endif; endif;
集成到 MSI 包中
下面简要介绍了使用 MSI 自定义操作 (方法 3 集成 Direct3D 11 部署所需的步骤,如本主题前面所述,) :
- 将名为 RelativePathToD3D11IH 的属性添加到 MSI 属性表,其中包含安装期间D3D11Install.exe和D3D11InstallHelper.dll的相对路径 (这通常位于媒体映像) 中。 这还将 MSI 属性D3D11IH_STATUS设置为 checkDirect3D11Status 返回的状态 (字符串属性等于枚举符号或“ERROR”) 。
- 在 CostFinalize 操作之后,调用D3D11InstallHelper.dll函数 SetD3D11InstallMSIProperties 作为即时自定义操作,为其他自定义操作设置相应的 MSI 属性。
- 安装后,在 InstallFiles 操作之后触发延迟的自定义操作,该操作调用 D3D11InstallHelper.dll 函数 DoD3D11InstallUsingMSI。 自定义操作必须将标志 msidbCustomActionTypeNoImpersonate 设置为在提升的上下文中运行。
- 在 InstallFinalize 操作之后,根据需要调用 D3D11InstallHelper.dll 函数 FinishD3D11InstallUsingMSI 作为即时自定义操作来处理成功的重启请求结果代码。
以下说明详细介绍了此过程,其中描述了可以使用 MSI 编辑器(如 Orca 编辑器)完成的过程。 某些 MSI 编辑器具有可简化其中一些配置步骤的向导。
配置 MSI 包以与 D3D11InstallHelper.dll
在 Orca 中打开 MSI 包。
将下表中显示的行添加到 MSI 包中的 Binary 表中。
名称 数据 D3D11IH DLL\D3D11InstallHelper.dll的文件路径 注意
此文件将嵌入到 MSI 包中,因此每次重新编译D3D11InstallHelper.dll时都必须执行此步骤。
将下表中显示的行添加到 MSI 包中的 CustomAction 表。
操作 类型 源 目标 Direct3D11SetProps msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH SetD3D11InstallMSIProperties Direct3D11DoInstall msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 D3D11IH DoD3D11InstallUsingMSI Direct3D11Finish msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH FinishD3D11InstallUsingMSI 将下表中针对 Action、Condition 和 Sequence 显示的值添加到 MSI 包中的 InstallExecuteSequence 表。
操作 条件 序列 说明 Direct3D11SetProps 1016 序列号将操作置于 CostFinalize 之后。 Direct3D11DoInstall 未安装 4004 此自定义操作仅在所有用户的新安装期间发生。 序列号将操作置于 InstallFiles 之后和回滚之后。 Direct3D11Finish 6615 序列号将操作置于 InstallFinalize 之后。 将下表中显示的行添加到 MSI 包中的 Property 表中。
属性 值 RelativePathToD3D11IH 包含D3D11Install.exe和D3D11InstallHelper.dll的相对文件路径 注意
路径指定的位置相对于安装路径指定的位置,例如“redist\”。
保存 MSI 包。 有关 MSI 包和 Windows Installer 的更多详细信息,请参阅 Windows Installer。
调试提示
D3D11InstallHelper.dll和D3D11Install.exe都可以使用 Visual Studio 中的调试配置生成,这些版本会将消息输出到标准 Windows 调试输出机制。
公司设置
D3D11InstallHelper 示例旨在通过 Windows 更新 进行标准部署,这是使用者安装游戏的最常见方案。 但是,许多游戏开发人员(为发布者和开发工作室工作)在具有本地托管服务器的企业设置中使用 Windows Server Update Services (WSUS) 技术提供软件更新。 在此类型的环境中,本地 IT 管理员对企业网络中的计算机可用的更新具有审批控制权,并且更新 KB 971644的标准使用者版本不可用。
在公司/企业设置中部署 DirectX 11 有三种基本解决方案:
- 在某些配置中,可以直接检查 Windows 更新而不是使用本地托管的 WSUS 服务器。 因此,D3D11InstallHelper 支持 /wu 命令行开关。 但是,并非所有公司网络都允许连接到公共 Microsoft 服务器。
- 本地 IT 管理员可以批准 KB 971512,这是从 WSUS 部署的企业支持的更新,包括 Direct3D 11 API。 这是标准用户在完全锁定的环境中获取 Direct3D 11 更新的唯一选项。
- 或者,可以手动安装 KB 971512 。
玩家的计算机只能从本地托管的 WSUS 服务器获取更新的情况非常罕见,只有大型组织中的开发人员才可能处于此类环境中。