c++ - Direct3D11 在哪里分配资源对象?

标签 c++ memory direct3d direct3d11

我已经阅读了很多关于 Direct3D11 的文章(包括这里关于堆栈溢出的内容!)并且在我所有的研究中我还没有能够最终回答这个问题:

当创建资源对象(即缓冲区或纹理对象)时,例如使用 pDevice->CreateBuffer(),它存储在哪里?在系统 RAM 上还是在 GPU 的视频 RAM 上?还是我完全误解了资源对象的基本性质?

显然,无论您用什么数据(例如顶点和索引数组)填充资源,都存储在您(程序员)放置它的任何位置,但是一旦您将该数据映射到资源,它会被复制到哪里? (我假设,由于必须映射和取消映射资源以实现读/写保护,映射数据实际上已被复制,可能复制到 VRAM)。此外,资源对象本身在哪里实例化?

在此先感谢您提供的所有帮助!

最佳答案

在资源创建期间,您的 Create* 调用会经过 D3D 运行时、UMD(用户模式图形驱动程序)和 KMD(内核模式)。 KMD 负责页表管理(它可以在共享虚拟内存的情况下与操作系统对话,但让我们忽略它)。如果您的资源不使用 SVM,则会将其写入显存。

处理器图形(例如 Intel Iris)的显存是您的系统 RAM。所以,它实际上只是从应用程序虚拟地址空间到 KMD 的一个拷贝。

对于独立显卡,数据驻留在显卡的显存中。 GPU 只能处理视频 RAM 中的数据。 (我不确定独立显卡的共享虚拟内存是如何工作的)

关于c++ - Direct3D11 在哪里分配资源对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19059579/

相关文章:

c++ - 使用 OpenCV 编译时出现 Gtk+ 3 错误

python - 内存使用量随着 Python 的 multiprocessing.pool 不断增长

Java2D 图形仅通过 OpenGL 管道渲染

c++ - CreateTexture2D 失败... (d3d)

c++ - 模板类字段的显式实例化声明

c++ - 处理跨平台的二进制依赖关系

c++ - "cast"指向 C++ 中函数指针的成员函数指针的最简单方法是什么?

C++ : terminate called after throwing an instance of 'std::bad_alloc' while computing length of big strings

swift - C 中的 offsetof(struct, member) 在 Swift 中的等价物是什么?

wpf - 是否可以通过 D3DImage 和 ANGLE 将 OpenGL ES 代码与 WPF 应用程序一起使用?