Skip to main content
本主題說明為 Microsoft Game Development Kit (GDK) 建立新的非同步程式設計模型時所訂定的設計目標。本主題也說明為回應開發人員的意見反應,相較於 XBOX One Software Development Kit 模型所做的改進。

本主題內容

簡介

Microsoft Game Development Kit (GDK) 引進了新的非同步 程式設計模型,旨在為您提供高度 可自訂且可控制的執行行為,同時具有低 處理和記憶體額外負荷。Microsoft Game Development Kit (GDK) 中的所有非同步 API 呼叫都使用 此模型以提供一致性。不過,非同步程式庫 也可以直接用於您自己的工作和非同步系統中,以管理 工作的排入佇列和分派。 Microsoft Game Development Kit (GDK) 中的新解決方案借鏡先前的 XBOX One Software Development Kit 非同步模型及 開發人員意見反應,讓 您能夠完全掌控非同步工作的執行方式和執行位置。 您可以使用任何執行緒設計,無論是在 單一執行緒上同步執行,或是在具有高度 特定優先順序和親和性遮罩的遊戲執行緒上平行執行。XBOX One Software Development Kit 只使用 系統執行緒集區。 Microsoft Game Development Kit (GDK) 的典範轉移透過使用 Win32 樣式的一般 C 或簡單 C++ API,改進了原本的 XBOX One Software Development Kit 解決方案。如此一來,您可以直接 管理記憶體配置和解除配置的時機。效能可以 更容易檢查,而且大部分 API 呼叫 (以及用於工作執行的所有非同步程式庫 API 呼叫) 都具有高效能 保證。

設計目標

非同步程式庫在設計時訂定了一些關鍵目標,以確保 遊戲能在 API 或系統的額外負荷最小的情況下獲得最佳效能。 下列清單包含一些高階目標。
  • 非同步程式碼一致,且容易理解和識別。
  • 您可以自由地完全管理回呼執行行為。
  • 您可以隨心所欲地使用執行緒。
  • 效能和記憶體使用量一致且容易管理。
  • 執行工作的系統額外負荷低,可在主要執行緒上使用。
  • 非同步程式庫不應僅限於 Microsoft Game Development Kit (GDK) API 使用。
其中部分目標會在下列子章節中說明,其他目標 則在本主題的相較於 XBOX One Software Development Kit 的改進 一節中說明。

一致且跨平台

一致性讓您對非同步 API 的撰寫方式 和運作方式有下列預期。
  • 方法和資料會加上 X 前置詞,後面接著程式庫名稱。
  • 一般錯誤會透過 HRESULT 錯誤碼回報。
  • Microsoft Game Development Kit (GDK) 中的所有非同步呼叫都使用 XAsyncBlock。
  • 非同步 Microsoft Game Development Kit (GDK) 起始方法會加上 Async 後置詞。
  • 非同步 Microsoft Game Development Kit (GDK) 結果方法會加上 Result 後置詞。
跨平台表示相同的非同步 API 呼叫可以 在 Microsoft Game Development Kit (GDK) 所鎖定的任何平台上使用。這些平台目前 包括 Windows PC (NDA 主題)、XBOX One 系列主機和 XBOX Series 主機 (NDA 主題)。 無論您是將非同步程式庫用於 Microsoft Game Development Kit (GDK) API 呼叫,或用於您自己的 功能,設定 XAsyncBlock 和啟動 非同步方法的流程始終相同。每當程式庫提供非同步 方法時,這些方法都會使用非同步 程式庫來實作。下表列出一些 公開非同步方法的程式庫。

開發人員完全掌控

新非同步程式庫的一個重要部分,是您 擁有完全的掌控權,能為遊戲達成最佳的 使用方式。這表示模型的許多部分都 可以自訂,包括下列項目。 在建立工作佇列時,您可以自訂兩個連接埠的回呼分派方式,如下表所示。 您可以使用 XTaskQueueSetCurrentProcessTaskQueue,取代未指定工作 佇列時遊戲所使用的預設工作佇列。 如果您想要確保一律指定工作佇列, 也可以搭配 nullptr 使用該函式來移除預設佇列。 這樣做時,如果未指定工作佇列, 就會產生錯誤。 如果您偏好對非同步呼叫使用輪詢,以得知 工作何時完成,可以使用 XAsyncGetStatus 來檢查傳回 碼。

任何執行緒處理情況

當工作佇列連接埠設定為使用手動分派時, 連接埠的分派時機或方式沒有任何限制。非同步 程式庫的實作是安全執行緒的,因此自訂的 執行緒處理和並行行為不需要鎖定就能進行。 關鍵區段、連鎖作業及其他相關的 多執行緒建構只需用於保護回呼中使用的 使用者資料,而不是非同步系統。 使用您自己的執行緒時,您可以根據實作情況的需要,自由設定親和性遮罩和 執行緒優先順序。您也 可以使用 Windows 訊息迴圈來處理分派。 手動連接埠中的工作回呼執行行為,完全 取決於您的執行緒如何設定為呼叫 XTaskQueueDispatch,如圖 1 和圖 2 所示。 圖 1. 顯示單一執行緒的回呼執行行為 單一執行緒回呼執行行為的螢幕擷取畫面 圖 2. 顯示多個執行緒的回呼執行行為 多個執行緒回呼執行行為的螢幕擷取畫面

相較於 XBOX One Software Development Kit 的改進

回應您的意見反應並改進過去的解決方案,對 Microsoft Game Development Kit (GDK) 來說非常重要 (NDA 主題)。下列 子章節列出與 XBOX One Software Development Kit 中的 非同步程式設計相比所做的一些重要改進。

不再使用 C++/CLI (WinRT)

XBOX One Software Development Kit 需要使用 C++/CLI (WinRT) 來實現非同步函式 行為。如此一來,系統就能管理其對 XBOX services 和 其他服務的呼叫,而不會遇到資源流失和錯誤等問題。不過,這也需要 學習新的程式碼撰寫語法,並考量系統隱含的時間 配量和資源使用量。 Microsoft Game Development Kit (GDK) 非同步模型將非同步程式庫的典範轉換為 Win32 樣式的 C 樣式 API 模型。Microsoft Game Development Kit (GDK) 程式碼可以 直接在 C/C++ 專案中使用,而不需要整合受控 WinRT 生態系統。因此,所有配置和行為都是隔離的 且易於理解,在系統執行緒上只有極少的背景行為。

完全掌控執行緒處理行為

XBOX One Software Development Kit 處理非同步呼叫的方式只有一種,就是 在系統集區執行緒上並行執行。可控制的範圍 僅限於調整系統執行緒集區。 在 Microsoft Game Development Kit (GDK) 中,執行緒處理可以如 XBOX One Software Development Kit 所述使用系統執行緒集區,也可以 透過手動執行緒處理進行自訂,為 應用程式建置所需的行為。使用手動執行緒處理時,回呼執行行為 取決於 XTaskQueueDispatch 的 呼叫方式和時機。如果只在一個執行緒上呼叫此函式,則行為 就會變成在該執行緒上同步執行。如果有數個執行緒同時呼叫此 函式,每個呼叫都會從工作佇列取得不同的回呼, 並平行執行它們。 本主題的開發人員完全掌控一節已說明不同的回呼執行行為。

以錯誤碼取代例外狀況

Microsoft Game Development Kit (GDK) 涵蓋許多新舊技術。因此, 錯誤處理可能因程式庫而異。非同步 程式庫設計為「無例外狀況」。這表示 例外狀況不會用於呼叫錯誤、流程控制、狀態回報, 或任何其他執行階段用途。您可以在遊戲中使用您自己的 例外狀況處理。 大部分錯誤和狀態碼現在都以標準 Win32 程式碼撰寫樣式,透過 HRESULT 碼 回報。當結果狀態碼不 重要時,可能會使用布林值。當 API 方法預期會 產生常見錯誤時,這些錯誤會列在文件中, 並說明其原因。 由於使用 HRESULT 碼,檢查代碼的簡單模式是 使用 Windows SUCCESS() 和 FAILED() 巨集。檢查 特定錯誤碼以決定如何繼續時,您可以檢查 HRESULT 值。 如需 Microsoft Game Development Kit (GDK) 中錯誤處理的詳細資訊,請參閱 Microsoft Game Development Kit 中的錯誤處理。

沒有記憶體回收

由於 Microsoft Game Development Kit (GDK) 不支援 C++/CLI (WinRT),這也表示 執行階段期間不會在背景中進行任何記憶體回收。 所有追蹤的 OS 配置都以直接 HANDLE 物件或程式庫所提供的自訂控制代碼 typedef 表示。 您可以使用控制代碼,將配置/解除配置的時機、行為和效能設定為由呼叫端管理。這些配置和 解除配置可以移至支援的載入器執行緒, 以避免效能停頓。在效能至關重要時,解除配置不會 意外發生。 不過,資源追蹤和避免記憶體流失 就成了您的責任。請確保任何已配置的 控制代碼在不再需要時都會解除配置。

保證高效能

XBOX One Software Development Kit 非同步模型因使用受控 COM 架構, 容易出現意外的記憶體和效能停頓,而且 有時很難掌握。不過,Microsoft Game Development Kit (GDK) 模型可確保 一致的效能和記憶體使用量。 由於可以控制執行緒處理,系統呼叫的效能 更容易使用分析工具或自訂程式碼來檢查。ATG 非同步程式設計範例內建了測試,可測量部分花費的時間。圖 3 中的圖表測量使用自訂非同步提供者管理 非同步工作所花費的時間。測試所使用的自訂執行緒 會盡快執行回呼。 圖 3. 顯示測量非同步系統額外負荷的圖表 測量非同步系統額外負荷的圖表螢幕擷取畫面 系統額外負荷非常低。額外負荷成本主要發生在 等待執行緒分派工作佇列連接埠時。忽略額外負荷成本, 整體非同步工作時間就是工作回呼中 實際執行的工作。

時間敏感執行緒

時間敏感執行緒是一項新規格, Microsoft Game Development Kit (GDK) 使用它來識別不希望有任何封鎖或 意外長時間執行作業的遊戲執行緒。使用者可以透過呼叫 XThreadSetTimeSensitive,將 遊戲執行緒標記為時間敏感。當執行緒標記為 時間敏感時,在該執行緒上叫用任何未提供一致且可靠 執行階段效能 (定義為非「時間敏感安全」) 的 Microsoft Game Development Kit (GDK) API 方法, 都會為您觸發偵錯判斷提示。 這些時間敏感安全方法在實作端包含下列 保證。
  • 不執行隨選載入或初始化。
  • 不進行跨 VM 或處理序界限的呼叫。
  • 記憶體配置受到限制。
如此一來,時間敏感安全方法在輸入相同時會以一致的 時間執行,且不會意外造成效能飆升。 許多 Microsoft Game Development Kit (GDK) 方法在內部都標記為時間敏感安全,而且 執行緒不需要標記為時間敏感,就能從呼叫時間敏感安全方法 獲得保證。 大部分非同步 API 方法都是時間敏感安全的。不是時間敏感安全的方法, 則與工作佇列設定及其他低頻率呼叫相關, 這些呼叫通常在載入或初始化時叫用。所有與 啟動、管理、取消、完成或以其他方式直接處理 非同步工作相關的方法,都是時間敏感安全的。如需不安全函式的詳細資訊,請參閱「時間敏感執行緒」主題的時間敏感執行緒的不安全函式一節。

Microsoft Game Development Kit (GDK) API 呼叫以外的泛型用法

Microsoft Game Development Kit (GDK) 的非同步程式庫是泛型的,不限於 API 呼叫 用途。Microsoft Game Development Kit (GDK) 提供的任何非同步呼叫都會在內部使用 非同步程式庫,並為啟動工作和取得結果等動作提供一致的方法。 如需將程式庫用於非 GDK API 用途的詳細資訊, 請參閱範例程式碼。 透過此設定,無論是 Microsoft Game Development Kit (GDK) 函式還是自訂 模式,啟動非同步工作 的流程都相同:為工作設定 XAsyncBlock, 然後啟動工作。啟動工作的可以是 Microsoft Game Development Kit (GDK) API 函式或自訂遊戲方法。 歡迎在整個遊戲中,將非同步程式庫用於任何 非同步用途。

參考 API 文件

另請參閱

非同步程式設計模型 設計工作佇列
Last modified on October 6, 2026