windows - D3D11_USAGE_STAGING,使用什么样的 GPU/CPU 内存?
问题描述
我阅读了D3D11 使用页面并来自 CUDA 背景,我想知道标记为的纹理D3D11_USAGE_STAGING
将存储到哪种内存中。
我想在 CUDA 中它将被固定页面锁定的零拷贝内存。我测量了从ID3D11Texture2D
withD3D11_USAGE_STAGING
到分配的主机缓冲区的传输时间malloc
,它花费了将近 7 毫秒(在流媒体/游戏中相当多),我认为这将是从 GPU 全局内存到该内存区域所需的时间。
我的任何假设是否正确?什么D3D11_USAGE_STAGING
用作 GPU 内存?
解决方案
的主要用途D3D11_USAGE_STAGING
是将数据加载到其他D3D11_USAGE_DEFAULT
池资源中的一种方式。另一个常见的用法是将渲染目标“回读”到 CPU 可访问内存。您可以使用CopySubResourceRegion
在 DEFAULT 和 STAGING 资源之间移动数据(离散硬件通常使用直接内存访问来处理系统内存和 VRAM 之间的数据移动)。
这是一个概括,因为它取决于架构和驱动程序的选择,但简而言之::
D3D11_USAGE_STAGING
意思是放到系统内存中,GPU不能访问。D3D11_USAGE_DEFAULT
把它放在VRAM中,CPU不能访问它。要将数据放入其中,需要从 STAGING 资源中复制数据。您可以将其UpdateSubresource
视为创建 STAGING 资源、将数据复制到其中、从 STAGING 复制到 DEFAULT,然后释放 STAGING 副本的便捷函数。- DirectX 11.2 或更高版本中有一个可选功能,如果驱动程序选择允许 CPU 访问甚至
D3D11_USAGE_DEFAULT
池内容,则驱动程序可以实现该功能。这取决于他们如何设置内存系统(即在统一内存架构中,系统 RAM 和 VRAM 是同一回事)。
- DirectX 11.2 或更高版本中有一个可选功能,如果驱动程序选择允许 CPU 访问甚至
D3D11_USAGE_IMMUTABLE
与 基本相同D3D11_USAGE_DEFAULT
,但您是说您只会在创建调用中对其进行一次初始化。D3D11_USAGE_DYNAMIC
意味着把它放在共享系统内存中,CPU和GPU都需要访问它。与 DEFAULT 相比,GPU 从中读取通常会降低性能,因此您希望谨慎使用它。它确实适用于您在 CPU 上生成每一帧然后需要渲染的东西(例如地形系统或程序几何)。
使用内容流的游戏通常具有一组 STAGING 纹理,它们在后台将数据加载到其中,然后
DEFAULT
在它们可用于高效渲染时将其复制到纹理中。这使他们可以重用 STAGING 和 DEFAULT 纹理,而无需每帧销毁/创建资源的开销。
请参阅 Microsoft Docs 上这篇有些过时的文章:资源管理最佳实践
推荐阅读
- java - 我想用下面给出的结构将 JSON 反序列化到给定的 Java 类中
- github - 如何在 Github 操作工作流文件中使用片段以避免重复?
- java - 如何在 HH:MM:SS 中显示倒数计时器(小时:分钟:秒)
- python - Python:随机时间的刺激变化
- javascript - ReactJs:尽管事件已正确触发,但下拉事件值仍设置为空字符串
- docker - docker-compose 服务列表在分支之间发生变化:服务既没有指定图像也没有指定构建上下文。必须提供至少一个
- javascript - 如何在不单击按钮的情况下加载页面时获得全屏页面
- python - 为什么我的模型不尊重约束?
- ssis - SSISDB 大小增长过多
- javascript - 在 JavaScript 地理编码器中使用 ajax