c++ - Directx 11 内存管理

标签 c++ memory directx-11

我研究 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 对缓冲区做了什么(复制/设置?)。

最佳答案

一般的回答是“它在司机想要的任何地方”。对于“动态”资源,它们通常被放入 CPU 和 GPU 都可以访问的内存中(在现代 PC 上,这是通过 PCIe 总线共享的)。对于“STATIC”资源,它们可以位于只能由 GPU 访问的视频 RAM 上,通过“共享”内存窗口复制,或者如果空间有限,它们将放在“共享”内存窗口中。渲染目标通常也放在视频 RAM 中。

要深入了解 Direct3D 视频内存管理,请查看“为什么您的 Windows 游戏无法在 2,147,352,576 中运行?”它不再在 MSDN 下载中,但可以在我的 blog 上找到.

如果您想要硬件的详细信息,请阅读 driver writer's documentation .

您还可以找到 Video Memory MSDN 代码库教育示例。

关于c++ - Directx 11 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416910/

相关文章:

ios - 幻象 EXC_BAD_ACCESS

c++ - 使用c++/WinRT Direct3D UWP Game DR模板Direct X11的错误消息

c# - 为什么在着色器中顺序很重要?

java - 使用 Java 读取非常大的文件

android - 如何诊断 Xamarin Android 弱引用表溢出的原因?

c++ - 将 ID3D11Texture2D 复制到字节数组,导致内存不足错误 c++

c++ - 如何制作 shared_ptr 列表?

c++ - 嵌套未命名的命名空间

c# - 点在边平行于轴的多边形内

c++ - 为什么这个程序片段的自动矢量化版本比简单版本慢