我已经阅读了很多关于 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/