2013-09-27 106 views
0

我对Direct3D11(这里包括堆栈溢出!)一直在阅读了很多,在我所有的研究,我一直无法确凿地回答这个问题:Direct3D11在哪里分配资源对象?

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

很显然,无论您将何处填充资源(比如顶点和索引数组)都存储在哪里 - 程序员 - 将其放置在其中,但是一旦将该数据映射到资源的复制位置? (我假设,因为资源必须被映射并且未被映射以用于读/写保护,所以映射的数据实际上被复制,可能被复制到VRAM)。而且,Resource对象本身在哪里实例化?

在此先感谢您的帮助!

+0

事实上,你不知道也找不到是DirectX的核心。这使得它可以像使用软件渲染器而不是GPU来处理事情,例如处理没有足够内存的视频卡。你不想*知道这个问题的答案。抽象实现细节是任何好的API的核心。 –

+0

这是一个很好的观点,在使用DirectX或任何其他API时,我一定会牢记这一点。谢谢!当然,这个问题与纯粹的学术问题一样,当然是:) –

回答

1

创建资源时,您的Create *调用会经过D3D运行时UMD(用户模式图形驱动程序)& KMD(内核模式)。 KMD负责页表管理(它可以在共享虚拟内存的情况下与操作系统交谈,但我们可以忽略它)。如果你的资源没有使用SVM,那么它会传递给图形内存。

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

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

+0

这是非常有意义的,这也是我怀疑的 - 但你的明确解释有助于解决问题。非常感谢你的帮助! –

+0

没问题。看看http://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/ – Raja