API 層 (Direct3D 10)
Direct3D 10 運行時間是以圖層建構,從核心的基本功能開始,並在外部層建置選擇性和開發人員輔助功能。
核心層
核心層預設存在;在 API 與設備驅動器之間提供非常精簡的對應,將高頻率呼叫的額外負荷降至最低。 由於核心層對於效能至關重要,因此只會執行重要的驗證。
其餘圖層是選擇性的。 一般規則是層會新增功能,但不會修改現有的行為。 例如,核心函式會有與具現化偵錯層無關的相同傳回值,不過如果偵錯層具現化,可能會提供額外的偵錯輸出。
呼叫 D3D10CreateDevice 並提供一或多個 D3D10_CREATE_DEVICE_FLAG 值,以建立裝置時建立圖層。
偵錯層
偵錯層提供廣泛的額外參數和一致性驗證(例如驗證著色器連結和資源系結、驗證參數一致性,以及報告錯誤描述)。 偵錯層所產生的輸出包含一組字串佇列,這些字串可使用 ID3D10InfoQueue 介面 來存取(請參閱 使用 ID3D10InfoQueue 自定義偵錯輸出 (Direct3D 10))。 核心層所產生的錯誤會以偵錯層的警告反白顯示。
若要建立支援偵錯層的裝置,您必須安裝 DirectX SDK (若要取得D3D10SDKLayers.DLL),然後在呼叫 D3D10CreateDevice時指定D3D10_CREATE_DEVICE_DEBUG旗標。 當然,使用偵錯層執行應用程式會大幅變慢。 若要開啟/停用 D3DX10 API 的偵錯訊息,請呼叫 D3DX10DebugMute。
當偵錯層列出記憶體流失時,它會輸出物件介面指標的清單及其易記名稱。 預設易記名稱為 「<未命名>」。 您可以使用 ID3D10DeviceChild::SetPrivateData 方法和 D3Dcommon.h 中的 WKPDID_D3DDebugObjectName GUID 來設定易記名稱。 例如,若要使用 SDKLayer 名稱命名 pTexture mytexture.jpg,請使用下列程式代碼:
const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );
一般而言,您應該從生產版本編譯這些呼叫。
切換至參考層
此層可讓應用程式在硬體裝置 (HAL) 與參考或軟體裝置 (REF) 之間轉換。 若要切換裝置,您必須先建立支援切換至參考層的裝置(請參閱 D3D10CreateDevice),然後呼叫 ID3D10SwitchToRef::SetUseRef。
所有裝置狀態、資源和物件都會透過此裝置轉換來維護。 不過,有時無法完全比對資源數據。 這是因為某些資訊可供參考裝置使用的硬體裝置使用。
幾乎所有即時應用程式都使用管線的 HAL 實作。 當管線從硬體裝置切換到參考裝置時,轉譯作業會在硬體和軟體中同時完成。 隨著軟體裝置的轉譯,其會要求將資源下載到系統記憶體。 這可能需要收回系統記憶體中快取的其他資源,才能騰出空間。
注意
只有 Direct3D 10 和 Direct3D 10.1 才支援這個切換對參考層功能,而且 Direct3D 11 和更新版本中不再支援此功能。
Thread-Safe 層
此層的設計目的是允許多線程應用程式從多個線程存取裝置。
Direct3D 10 應用程式可以使用裝置功能來控制裝置同步處理。 這可讓應用程式啟用/停用重要區段(暫時啟用/停用多線程保護),並取得/釋放多個 Direct3D 10 API 進入點的重要區段鎖定。 默認會啟用安全線程層。 對於單個線程應用程式,安全線程層不會影響效能。
Direct3D 9 與 Direct3D 10 之間的差異:
- 不同於 Direct3D 9,Direct3D 10 API 預設為完全安全線程。
相關主題