我学习Directx 11已经有一段时间了,但是我仍然对Directx 11如何管理内存感到困惑。例如,如果我使用ID3D11Device::CreateBuffer创建一个顶点缓冲区,那么新缓冲区存储在哪里?我知道它返回一个指向缓冲区的指针,这意味着它必须存储在CPU RAM中,对吗?但是,我认为这将使ID3D11DeviceContext::IASetVertexBuffers成为一个非常慢的过程,因为它必须将缓冲区从CPU RAM复制到GPU RAM。但是如果用ID3D11Device:CreateBuffer创建的所有缓冲区都存储在GPU中,那么GPU不是很快就会被填满吗?基本上,我想知道:当我创建一个缓冲区时,数据存储在哪里?在CPU RAM还是GPU RAM中?另外,ID3D11DeviceContext::IASetVertexBuffers使用缓冲区做什么(复制/设置)。
发布于 2014-10-17 04:32:38
一般的答案是“它在司机想要的地方”。对于“动态”资源,它们通常被放入内存中,CPU和GPU都可以访问它们(在现代PC上,这是通过PCIe总线共享的)。对于“静态”资源,它们可以放在只能通过‘共享’内存窗口复制的GPU访问的视频RAM上,或者如果空间有限,则将它们放在‘共享’内存窗口中。渲染目标通常也放置在视频RAM中。
要更深入地研究Direct3D视频内存管理,请查看“为什么您的Windows游戏不能在2,147,352,576中运行?”它已经不在MSDN下载上了,但可以在我的博客上找到。
如果您想了解硬件细节,请阅读驾驶员书写文档。
您还可以在MSDN代码库教育版上找到视频存储器示例。
https://stackoverflow.com/questions/26416910
复制相似问题