2014-10-17 143 views
5

我一直在研究Directx 11一段時間了,但我仍然對Directx 11如何管理內存感到困惑。例如,如果我使用ID3D11Device :: CreateBuffer創建一個頂點緩衝區,那麼新的緩衝區在哪裏存儲?我知道它返回一個指向緩衝區的指針,這意味着它必須存儲在CPU RAM上嗎?但是,我認爲這會使ID3D11DeviceContext :: IASetVertexBuffers成爲一個非常緩慢的過程,因爲它必須將CPU RAM中的緩衝區複製到GPU RAM中。但是,如果使用ID3D11Device:CreateBuffer創建的所有緩衝區都存儲在GPU RAM中,那麼GPU RAM會不會很快填滿?基本上我想知道:當我創建一個緩衝區時,數據在哪裏存儲?在CPU RAM或GPU RAM中?此外,什麼是ID3D11DeviceContext :: IASetVertexBuffers與緩衝區(複製/設置?)。Directx 11內存管理

回答

7

一般的答案是「它是駕駛員想要的地方」。對於「DYNAMIC」資源,它們通常放置在CPU和GPU均可訪問的內存中(在現代PC上,這是通過PCIe總線共享的)。對於「靜態」資源,它們可以放在只能通過「共享」存儲器窗口複製的GPU訪問的視頻RAM中,或者如果空間有限,則放入「共享」存儲器窗口中。渲染目標通常也放在視頻RAM中。

想要深入瞭解Direct3D視頻內存管理,請查看「爲什麼Windows遊戲不會在2,147,352,576中運行?」這不再在MSDN下載,但可以在我的blog找到。

如果您需要詳細的硬件詳細信息,請閱讀driver writer's documentation

您也可以在MSDN代碼庫教育中找到Video Memory示例。