遊戲開發人員的 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 操作系統中。 Direct3D 11 API 和相關元件也可以使用 Windows Update 的系統更新,安裝在 Windows Vista 上。 此更新需要 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 安裝。 「效果 11」可在 Direct3D 11 Update 的 Effects 中以共用來源支援連結庫的形式提供,而且您可以將它直接納入應用程式(就像 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 Server 2008 R2 上提供 Direct3D 11.1 API 的部分支援,並 已安裝適用於 Windows 7 的平臺更新。 如需 Windows 7 平臺更新的詳細資訊,請參閱 適用於 Windows 7 的平臺更新。
D3D11InstallHelper.dll
D3D11InstallHelper.dll 裝載偵測 Direct3D 11 元件的核心功能,並視需要透過 Windows Update 服務執行系統更新。 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 Update API 來執行系統更新,以在此系統上安裝 Direct3D 11。 請注意,此函式需要 Windows Update 的網路連線才能成功,以及系統管理許可權。 它會採用選擇性的進度回呼函式和用戶內容指標,並在完成時傳回最終的結果碼。
- D3D11IH_RESULT_SUCCESS結果表示系統更新已套用且已可供使用,而D3D11IH_RESULT_SUCCESS_REBOOT表示系統更新要求計算機在完成之前重新啟動。 請注意,此函式不會排程系統重新啟動。
- D3D11IH_RESULT_NOT_SUPPORTED表示系統更新不適用於此版本的 Windows。 只有在從 CheckDirect3D11Status 取得D3D11IH_STATUS_REQUIRES_UPDATE狀態之後,才會呼叫此結果。
- D3D11IH_RESULT_UPDATE_NOT_FOUND的結果表示 Windows Update 伺服器上找不到系統更新套件。
- 如果 Windows Update 下載或安裝失敗,則會傳回結果D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED或D3D11IH_RESULT_UPDATE_INSTALL_FAILED。
- 如果從 Windows Update API 傳回網路連線錯誤,則會傳回D3D11IH_RESULT_WU_SERVICE_ERROR結果,指出問題可能是間歇性或與網路設定或防火牆設定相關的。 再次嘗試更新函式可能會成功。
如需 Windows Update API 的詳細資訊,請參閱 Windows Update 代理程式 API。
D3D11Install.exe
注意
D3D11Install.exe 需要 D3D11InstallHelper.dll 才能執行。
D3D11Install.exe 是一種使用 D3D11InstallHelper.dll 作為獨立安裝程式的工具,其中包含UI和使用者訊息,以及作為適當使用 DLL 的範例。 如果已安裝 Direct3D 11,則此程式會以 0 結束,如果系統更新成功套用,而不需要重新啟動系統、需要 Service Pack 安裝,或此電腦不支援 Direct3D 11。 如果成功套用系統更新,而且需要系統重新啟動才能完成,則會傳回 1。 針對其他錯誤狀況傳回 2。 請注意,此可執行檔需要系統管理員許可權才能執行,而且其具有指令清單,可在啟用UAC的 Windows Vista 或 Windows 7 上執行時要求提高許可權。 D3D11Install.exe 可作為部署 Direct3D 11 更新的獨立工具,也可以由安裝程式直接使用。
它支援下列命令列參數:
-
/安靜
-
不顯示任何訊息、提示、進度對話框或錯誤訊息。
-
/被動
-
不會顯示任何訊息、提示或錯誤訊息,但會顯示進度對話方塊。
-
/最小
-
只顯示最少的提示。
-
/Y
-
隱藏提示,確認視需要且適用於標準和最小安裝來安裝更新。
-
/langid 十進位
-
強制顯示使用者訊息和對話框資源時要使用的語言標識碼。 默認值為 1024,它會使用系統預設語言設定。
-
/五
-
強制使用 Windows Update,而不是系統預設值,這可能是在受管理伺服器或其他一些非標準組態上執行的 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 專案
- 在 [安裝設計工具] 索引卷標上,按兩下左側瀏覽窗格中 [行為和邏輯] 底下的 [支援檔案/看板]。
- 按兩下 [語言獨立],然後在 [檔案] 視窗中按下滑鼠右鍵,然後選取 [插入檔案]。 流覽以新增 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 自定義動作整合 Direct3D 11 部署所需的步驟的高階描述(使用本主題稍早所述的方法 3):
- 將屬性新增至名為 RelativePathToD3D11IH 的 MSI 屬性數據表,其中包含安裝期間 D3D11Install.exe 和 D3D11InstallHelper.dll 的相對路徑(這通常是在媒體映射中)。 這也會將 MSI 屬性D3D11IH_STATUS CheckDirect3D11Status 傳回的狀態(字串屬性等於列舉符號或 “ERROR” )。
- 在 CostFinalize 動作之後,呼叫 D3D11InstallHelper.dll 函 式 SetD3D11InstallMSIProperties 作為立即自定義動作,以設定其他自定義動作的適當 MSI 屬性。
- 安裝時,請在呼叫 D3D11InstallHelper.dll 函 式 DoD3D11InstallUsingMSI 的 InstallFiles 動作之後觸發延後自定義動作。 自定義動作必須設定旗標 msidbCustomActionTypeNoImpersonate,才能在提升許可權的內容中執行。
- 在 InstallFinalize 動作之後,視需要呼叫 D3D11InstallHelper.dll 函 式 FinishD3D11InstallUsingMSI 作為立即自定義動作,以處理成功的重新啟動要求結果碼。
下列指示會詳細說明此程式,其描述可使用 MSI 編輯器完成的程式,例如 Orca 編輯器。 有些 MSI 編輯器有精靈,可簡化其中一些設定步驟。
設定 MSI 套件以與 D3D11InstallHelper.dll 整合
在 Orca 中開啟 MSI 套件。
將下表中顯示的數據列新增至 MSI 套件中的二進位數據表。
名稱 資料 D3D11IH DLL\D3D11InstallHelper.dll 的檔案路徑 注意
此檔案會內嵌在 MSI 套件中,因此您必須在每次重新編譯 D3D11InstallHelper.dll 時執行此步驟。
將下表中顯示的數據列新增至 MSI 套件中的 CustomAction 數據表。
動作 類型 來源 Target 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 數據表。
動作 Condition 序列 備註 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 Update 的標準部署所設計,這是消費者安裝遊戲最常見的案例。 不過,許多遊戲開發人員在發行者和開發工作室中工作,在具有使用 Windows Server Update Services (WSUS) 技術的本機受管理伺服器提供軟體更新的企業設定中執行此動作。 在此類型的環境中,本機IT系統管理員可控制哪些更新可供公司網路內的計算機使用,且無法使用標準取用者版本的更新 KB 971644。
在公司/企業設定中部署 DirectX 11 有三個基本解決方案:
- 在某些設定中,可以直接檢查 Windows Update,而不是使用本機受控 WSUS 伺服器。 因此,D3D11InstallHelper 支援 /wu 命令行參數。 不過,並非所有公司網路都允許連線到公用 Microsoft 伺服器。
- 本機 IT 系統管理員可以核准 KB 971512,這是從 WSUS 部署的企業支援更新,其中包含 Direct3D 11 API。 這是標準使用者在完全鎖定的環境中取得 Direct3D 11 更新的唯一選項。
- 或者, 也可以手動安裝 KB 971512 。
玩家的計算機只能從本機管理的 WSUS 伺服器取得更新是非常罕見的,而且只有大型組織中的開發人員才可能處於這類環境。