首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以编程方式创建directx 11纹理、三种不同方法的优缺点

以编程方式创建directx 11纹理、三种不同方法的优缺点
EN

Stack Overflow用户
提问于 2011-06-14 18:04:16
回答 1查看 9.6K关注 0票数 15

msdn documentation解释说,在directx 11中有多种方法以编程方式填充directx 11纹理:

(1)使用默认用法纹理创建纹理,并使用内存中的数据初始化纹理

(2)创建具有动态用法的纹理,使用DeviceContext映射获取纹理内存的指针,写入纹理内存,然后使用Unmap指示完成(此时我猜它被复制到gpu)

(3)创建具有分阶段用法的纹理,并遵循与动态纹理相同的步骤,但随后调用ID3D11DeviceContext.CopyResource使用这个暂存纹理来填充(非不变的)默认或动态纹理。

然而,这些文档根本没有解释每种方法的优缺点,而且我对directx还很陌生,所以我一点也不清楚。

在directx 11中以编程方式创建纹理的每种方法的优缺点是什么?

侧记:我在暂存纹理的上下文中读到过,从gpu读取数据没有缓冲,所以您必须自己进行双缓冲。但我不知道这是否准确,也不知道它是否适用于使用暂存纹理(甚至是它的真正含义)的写作。

第二部分注意:方法文档表示它获得子资源中数据的指针,并拒绝GPU对该子资源的访问。当GPU想要访问其底层数据被Map调用的纹理时,它会做什么?失速?(我问是因为这听起来像是我询问的利弊的一部分)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-30 18:42:50

正确的答案取决于你要使用的纹理是什么。这三个选项是从CPU获取数据到纹理的不同方法。如果这是一个呈现目标,通常不会从CPU提供初始数据,因此您可以忽略这些数据:创建纹理,以及当您准备好将其呈现到其中(可能首先清除())。

因此,假设您在应用程序内存中有想要进入纹理的数据:

如果这只是一个静态纹理(我的意思是纹理是从比写入的纹理更多的内容中读取的),那么您需要一个USAGE_DEFAULT或USAGE_IMMUTABLE纹理。与USAGE_DYNAMIC相比,它们通常是针对GPU读取性能进行优化的。如果在创建纹理时有现成的数据,那么选项(1)是最简单的,使用最少的中间内存,在DX11中,数据传输到GPU可以在呈现线程之外的一个单独线程上完成。如果在创建纹理时没有数据,则使用UpdateSubresource()或选项(3)提供数据。

如果这是一个动态纹理,意味着您经常从CPU中提供新内容(基于CPU的视频回放是典型的情况:数据由CPU每帧提供一次,然后由GPU每帧读取一次),那么您可能希望使用USAGE_DYNAMIC和选项(2)。USAGE_DYNAMIC纹理是针对从CPU到GPU的流数据而不是简单的GPU读取而优化的。硬件厂商之间的细节(以及性能影响)各不相同,但通常您只希望在从CPU到GPU之间传输数据时才使用USAGE_DYNAMIC,而不是仅仅因为这是一种方便的预先加载静态数据的方法。

选项(3)更专门化,可以用于将初始数据加载到静态纹理(为许多纹理重新使用分期面以加载数据)或用于相对动态使用的流数据。它使您对GPU/CPU同步和用于传输的中间内存进行精确控制。通常,您会使用一个暂存缓冲区环,并使用D3D11_MAP_FLAG_DO_NOT_WAIT来检查每个缓冲区是否仍由以前的CopyResource使用。我认为这是一个专家的选择--如果你不小心,你可以通过阻止CPU和GPU异步运行来严重伤害perf。

完全披露:我在Nvidia的D3D驱动程序工作,但这些都是我个人的观点。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6347950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档