立即和延後轉譯

Direct3D 11 支援兩種類型的轉譯:立即和延遲。 兩者都是使用 ID3D11DeviceCoNtext 介面來實作。

立即轉譯

立即轉譯是指從裝置呼叫轉譯 API 或命令,以將緩衝區中的命令排入佇列,以在 GPU 上執行。 使用即時內容來轉譯、設定管線狀態,以及播放命令清單。

使用 D3D11CreateDeviceD3D11CreateDeviceAndSwapChain建立立即內容。

延後轉譯

延後轉譯會在命令緩衝區中記錄圖形命令,以便其他時間播放圖形命令。 使用延後的內容來記錄 (轉譯的命令,以及將狀態設定) 至命令清單。 延後轉譯是 Direct3D 11 中的新概念;延後轉譯的設計目的是支援在一個執行緒上轉譯,同時錄製命令以在其他執行緒上轉譯。 這個平行的多執行緒策略可讓您將複雜的場景分成並行工作。 如需轉譯複雜場景的詳細資訊,請參閱 多階段轉譯

使用 ID3D11Device::CreateDeferredCoNtext建立延後的內容。

Direct3D 會在將命令緩衝區中的命令排入佇列時產生轉譯額外負荷。 相反地, 命令清單 會在播放期間更有效率地執行。 若要使用命令清單,請記錄具有延後內容的轉譯命令,並使用即時內容加以播放。

您只能以單一執行緒方式產生單一命令清單。 不過,您可以同時建立及使用多個延後的內容,每個內容都會在不同的執行緒中。 然後,您可以使用這些多個延後的內容,同時建立多個命令清單。

您無法在即時內容上同時播放兩個或多個命令清單。

若要判斷裝置內容是否為立即或延後的內容,請呼叫 ID3D11DeviceCoNtext::GetType

ID3D11DeviceCoNtext::Map方法僅支援動態資源 (D3D11_USAGE_DYNAMIC) 延遲的內容,其中命令清單中的第一次呼叫是D3D11_MAP_WRITE_DISCARD。 如果給定的資源類型可用,後續呼叫支援D3D11_MAP_WRITE_NO_OVERWRITE

延遲內容中的查詢僅限於資料產生和述詞繪圖。 您無法在延後的內容上呼叫 ID3D11DeviceCoNtext::GetData 來取得查詢的相關資料;您只能在即時內容上呼叫 GetData ,以取得查詢的相關資料。 您可以呼叫 D3D11DeviceCoNtext::SetPredication ,在 GPU 上使用查詢結果,以設定轉譯述詞 (查詢) 類型。 您可以透過呼叫 ID3D11DeviceCoNtext::BeginID3D11DeviceCoNtext::End來產生查詢資料。 不過,在您呼叫立即內容上的 ID3D11DeviceCoNtext::ExecuteCommandList 以提交延後的內容命令清單之前,將無法使用查詢資料。 然後,GPU 會處理查詢資料。

多執行緒