DirectX 11内存管理

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正在对缓冲区执行什么操作(复制/设置)?

1个回答

10
一般来说,“它在驱动程序想要的地方”。对于“DYNAMIC”资源,它们通常放在内存中,该内存可由CPU和GPU访问(在现代PC上,这是通过PCIe总线共享的)。对于“STATIC”资源,它们可以在仅由GPU可访问的视频RAM上,并通过“共享”内存窗口进行复制,或者如果空间有限,则将它们放在“共享”内存窗口中。渲染目标通常也放在视频RAM中。
要深入了解Direct3D视频内存管理,请查看名为“为什么您的Windows游戏无法运行2,147,352,576次?”的演讲,该演讲不再提供MSDN下载,但可以在我的博客上找到。
如果您想了解细节硬件信息,请阅读驱动程序编写者文档

您也可以在 MSDN Code Gallery 找到有关 视频内存 的示例,这对教育很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接