我阅读了D3D11 Usage页面并来自CUDA背景我想知道将标记为D3D11_USAGE_STAGING
的纹理存储到哪种内存中。
我想在CUDA中会固定页面锁定的零拷贝内存。我测量了从带有ID3D11Texture2D
的{{1}}到分配有D3D11_USAGE_STAGING
的主机缓冲区的传输时间,它花了将近7毫秒(在流媒体/游戏中相当多),我认为这将是从GPU全局内存到该内存区域所需的时间。
我的任何假设是否正确?什么是malloc
用作GPU内存?
答案 0 :(得分:6)
D3D11_USAGE_STAGING
的主要用途是将数据加载到其他D3D11_USAGE_DEFAULT
池资源中。另一个常见的用法是回读' CPU可访问内存的渲染目标。您可以使用CopySubResourceRegion
在DEFAULT和STAGING资源之间移动数据(离散硬件通常使用Direct Memory Access来处理系统内存和VRAM之间的数据移动。)
这是一种概括,因为它取决于架构和驱动程序选择,但简而言之::
D3D11_USAGE_STAGING
表示将其放入系统内存,GPU无法访问它。
D3D11_USAGE_DEFAULT
将其放入VRAM,CPU无法访问它。要将数据放入其中,需要从STAGING资源复制数据。您可以将UpdateSubresource
视为一个便利函数,它创建一个STAGING资源,将数据复制到它,从STAGING复制到DEFAULT,然后释放STAGING副本。
D3D11_USAGE_DEFAULT
池内容,则可由驱动程序实现。这取决于他们如何设置内存系统(即Unified Memory Architectures,系统RAM和VRAM是一样的。) D3D11_USAGE_IMMUTABLE
与D3D11_USAGE_DEFAULT
基本相同,但您说您只是在创建调用中初始化它一次。
D3D11_USAGE_DYNAMIC
意味着将它放在共享系统内存中,即CPU和CPU。 GPU都需要访问它。与DEFAULT相比,GPU通常会从中读取性能,因此您需要谨慎使用它。它实际上是你在CPU上生成每一帧然后需要渲染的东西(例如地形系统或程序几何)。
使用内容流的游戏通常会有一组STAGING纹理,它们会将数据加载到背景中,然后在它们可用于高效渲染时将其复制到
DEFAULT
纹理。这使他们可以重复使用STAGING和DEFAULT纹理,而不会在每一帧中破坏/创建资源。
请参阅这篇有点过时的MSDN文章:Resource Management Best Practices