語法
參數
Subresource類型:UINT 指定子資源的索引編號。 pReadRange [in, optional]
類型:const D3D12_RANGE * 指向 D3D12_RANGE 結構的指標,該結構描述要存取的記憶體範圍。 這表示 CPU 可能讀取的區域,且座標是相對於子資源。Null 指標表示 CPU 可能讀取整個子資源。傳遞 End 小於或等於 Begin 的範圍,以指定 CPU 不會讀取任何資料,是有效的做法。 ppData [out, optional]
類型:void ** 指向記憶體區塊的指標,該區塊會接收資源資料的指標。 Null 指標是有效的,且適用於為 WriteToSubresource 等方法快取 CPU 虛擬位址範圍。當 ppData 不是 NULL 時,傳回的指標永遠不會因 pReadRange 中的任何值而產生位移。
傳回值
類型:HRESULT 此方法會傳回其中一個 Direct3D 12 傳回碼。備註
多個執行緒可以安全地呼叫 Map 和 Unmap。支援巢狀 Map 呼叫,且會進行參考計數。第一次呼叫 Map 時會為資源配置 CPU 虛擬位址範圍。最後一次呼叫 Unmap 時會解除配置 CPU 虛擬位址範圍。CPU 虛擬位址通常會傳回給應用程式;但操作版面配置未知之紋理的內容時,則無法揭露 CPU 虛擬位址。如需詳細資訊,請參閱 WriteToSubresource。除非 Map 持續保持巢狀,否則應用程式不能依賴位址保持一致。 Map 傳回的指標不保證具備一般指標的所有功能,但大部分應用程式在一般使用情況下不會察覺差異。例如,具有 WRITE_COMBINE 行為的指標,其 CPU 記憶體排序保證比 WRITE_BACK 行為弱。由於 PCIe 的限制,CPU 和 GPU 皆可存取的記憶體不保證與 CPU 具有相同的不可部分完成記憶體保證。請使用柵欄進行同步處理。 Map 的使用模型分為兩類:簡單和進階。簡單使用模型可將工具效能最大化,因此建議應用程式持續使用簡單模型,直到證實應用程式需要進階模型為止。簡單使用模型
應用程式應遵循 UPLOAD、DEFAULT 和 READBACK 的堆積類型抽象,以合理地支援所有介面卡架構。 應用程式應避免 CPU 從指向 UPLOAD 堆積上資源的指標讀取,即使是意外的讀取也應避免。CPU 讀取可以運作,但在許多常見的 GPU 架構上速度慢到令人無法接受,因此請考慮下列事項:- 不要讓 CPU 從與 D3D12_HEAP_TYPE_UPLOAD 堆積或具有 D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE 之堆積相關聯的資源讀取。
- pData 所指向的記憶體區域可以使用 PAGE_WRITECOMBINE 配置,而您的應用程式必須遵守與此類記憶體相關的所有限制。
- 即使是下列 C++ 程式碼也可能從記憶體讀取並觸發效能損失,因為程式碼可能會展開為下列 x86 組合語言程式碼。C++ 程式碼:x86 組合語言程式碼:
- 使用適當的最佳化設定和語言結構,協助避免此效能損失。例如,您可以使用 volatile 指標,或針對程式碼速度而非程式碼大小進行最佳化,以避免 xor 最佳化。
進階使用模型
CPU 可存取之堆積上的資源可以持續對應,也就是說,可以在建立資源後立即呼叫一次 Map。永遠不需要呼叫 Unmap,但在釋放資源的最後一個參考之後,就不得再使用 Map 傳回的位址。使用持續對應時,應用程式必須確保 CPU 在 GPU 執行讀取或寫入該記憶體的命令清單之前,完成將資料寫入記憶體。在常見情況下,應用程式只需在呼叫 ExecuteCommandLists 之前寫入記憶體即可;但使用柵欄延遲命令清單執行也同樣可行。 所有 CPU 可存取的記憶體類型都支援持續對應用法,也就是資源經過對應後永遠不會解除對應,前提是應用程式在資源處置後不會存取該指標。範例
D3D12Bundles 範例使用 ID3D12Resource::Map 的方式如下: 將三角形資料複製到頂點緩衝區。需求
標頭: d3d12_xs.h 或 d3d12_x.h程式庫: d3d12_xs.lib 或 d3d12_x.lib
支援的平台: XBOX Series 主機與 XBOX One 系列
