【问题标题】:Where Does Direct3D11 Allocate Resource Objects?Direct3D11 在哪里分配资源对象?
【发布时间】:2013-09-27 20:30:59
【问题描述】:

我一直在阅读有关 Direct3D11 的大量信息(包括这里关于堆栈溢出的内容!),在我的所有研究中,我都无法最终回答这个问题:

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

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

提前感谢您的任何帮助!

【问题讨论】:

  • 你不知道也找不到的事实是DirectX的核心。这允许它执行诸如使用软件渲染器而不是 GPU 并处理没有足够内存的视频卡之类的事情。你不想知道这个问题的答案。抽象实现细节是任何好的 api 的核心。
  • 这是一个很好的观点,在使用 DirectX 或任何其他 API 时,我一定会牢记这一点。谢谢!当然,这个问题既是一个纯粹的学术问题,也是一个实际问题:)

标签: c++ memory direct3d direct3d11


【解决方案1】:

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

处理器图形(例如 Intel Iris)的图形内存是您的系统 RAM。因此,它实际上只是从应用程序虚拟地址空间到 KMD 的副本。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2018-10-14
  • 2014-08-17
  • 2011-09-19
  • 2014-07-10
相关资源
最近更新 更多