以编程方式创建Directx 11纹理,三种不同方法的优缺点

| msdn文档说明,在DirectX 11中,可以通过多种方式以编程方式填充DirectX 11纹理: (1)使用默认用法纹理创建纹理,并使用内存中的数据对其进行初始化 (2)创建具有动态用法的纹理,使用DeviceContext Map获取指向纹理内存的指针,对其进行写入,然后使用Unmap指示已完成(这时我猜它已复制到gpu) (3)创建具有临时用途的纹理,并遵循与动态纹理相同的步骤,但在此之后,调用ID3D11DeviceContext.CopyResource以使用此临时纹理依次填充(非不变的)默认或动态纹理。 但是,文档根本没有解释每种方法的优缺点,而且我对DirectX还是很陌生,所以对我来说一点也不清楚。 在DirectX 11中以编程方式创建纹理的每种方式的优缺点是什么? 旁注:我已经读到,在暂存纹理的上下文中,不缓冲从gpu读回的数据,因此您必须自己进行双缓冲。但是我不知道这是否正确,以及它是否适用于使用暂存纹理进行书写(甚至实际上是什么意思)。 第二点注意:Map方法文档说,它获取指向子资源中数据的指针,并拒绝GPU访问该子资源。当GPU要访问其基础数据已被Map调用的纹理时,该怎么做?失速了吗(我问,因为这听起来像是我所询问的利弊的一部分)     
已邀请:
        正确的答案取决于您要使用纹理的目的。这三个选项是将数据从CPU放入纹理的不同方式。如果这是一个渲染目标,则通常不提供来自CPU的初始数据,因此您可以忽略以下内容:创建纹理,以及准备渲染到其中(也许先进行Clear()处理)。 因此,假设您确实要在应用程序内存中包含要进入纹理的数据: 如果这只是静态纹理(也就是说,我读取的纹理远大于写入的纹理),则需要使用USAGE_DEFAULT或USAGE_IMMUTABLE纹理。与USAGE_DYNAMIC相比,这些通常针对GPU读取性能进行了优化。如果创建纹理时方便使用数据,则选项(1)最简单,使用的中间内存最少,在DX11中,可以在与渲染线程不同的线程上完成向GPU的数据传输。如果创建纹理时没有数据,请使用UpdateSubresource()或选项(3)来提供数据。 如果它是动态纹理,则意味着您经常从CPU提供新内容(典型的情况是基于CPU的视频播放:CPU每帧一次提供数据,然后GPU每帧一次读取数据),那么您可能想要使用USAGE_DYNAMIC和选项(2)。 USAGE_DYNAMIC纹理经过优化,可将数据从CPU传输到GPU,而不是简单地用于GPU读取。细节(和性能影响)因硬件供应商而异,但是通常您只想使用USAGE_DYNAMIC(如果您确实是将数据从CPU传输到GPU),而不是简单地因为它是预先加载静态数据的便捷方式。 选项(3)更专业,可用于将初始数据加载到静态纹理中(重用临时表面以加载许多纹理的数据)或用于流数据以相对动态地使用。它使您可以精确控制GPU / CPU同步以及用于传输的中间存储器。通常,您将使用一组暂存缓冲区,并使用D3D11_MAP_FLAG_DO_NOT_WAIT来检查每个缓冲区是否仍被先前的CopyResource使用。我认为这是一个专家选择-如果您不小心,可能会阻止CPU和GPU异步运行,从而严重损害性能。 完全公开:我在Nvidia上从事D3D驱动程序的工作,但这是我个人的看法。     

要回复问题请先登录注册