0
我使用ID3D12Resource::Map
方法更新GPU資源。這是最有效的方法嗎?還有什麼替代方案?用堆類型上傳更新GPU資源的最佳方式是什麼?
我使用ID3D12Resource::Map
方法更新GPU資源。這是最有效的方法嗎?還有什麼替代方案?用堆類型上傳更新GPU資源的最佳方式是什麼?
上傳堆資源有了閱讀相關的成本,這比默認的資源更高。
在不斷緩衝區的情況下,這通常是罰款(如你在一次寫入/讀取一次的情況),但在其他情況下(大頂點/索引緩衝),這通常是不可取的。
的一般方法是創建兩個資源(一個上傳堆內,一個默認堆內),(使用地圖,你所提到的)的數據複製到上傳的資源,然後利用執行GPU副本要麼CopyResource或默認資源中爲CopyBufferRegion。
請確保您有正確的資源狀態建立前/後的資源複製後,使用ResourceBarrier和過渡狀態。
之前調用拷貝,資源應該在備份之前D3D12_RESOURCE_STATE_COPY_DEST,和任何依賴於你的資源讀取標誌。
另請注意,您可以使用副本命令隊列用於GPU副本(這樣您可以避免在直接命令列表中執行),但是您需要確保副本在使用資源之前完成(通過使用柵欄)。
多引擎在MSDN中描述here
請注意,如果你只是_writing_的資源,你可以直接寫入,而不是使用上載獲得更快的性能 - 因爲你可以用寫合併的內存(特別是如果你經常這樣做)。這是你必須優化/檢查你的場景的其中一件事。 – cmaughan
@cmaughan值得一說,這只是針對緩衝區真的,有沒有辦法將紋理映射的方式。 – galop1n
@ galop1n Nope;你也可以用紋理來做到這一點。但是,再一次,你必須分析哪個更快。 – cmaughan