向 Texture2D 复制和从 Texture2D 复制的最快方式

The fastests way to copy to and from Texture2D

出于某种原因,我必须从纹理复制到缓冲区,然后将其重新加载回纹理。 源纹理是来自解码器的纹理,目标纹理是将要渲染的纹理。最简单的方法(据我所知)是执行以下操作:

  1. 解码器 tex(ID3D11Texture2D)
  2. 使用临时纹理(Usage = D3D11_USAGE_STAGING)
  3. CopyResource 临时纹理
  4. 'Map'
  5. memcpy_s 缓冲
  6. Unmap

另一边倒退

  1. 使用临时纹理(Usage = D3D11_USAGE_STAGING)
  2. Map
  3. memcpy_s 来自缓冲区
  4. Unmap
  5. CopyResource 到渲染器纹理

工作正常,但我感觉我没有尽可能高效地完成它(除了我来回复制数据的事实) 我必须使用暂存纹理吗?我能否调整 decoder/renderer 纹理标志(BindFlags?)或地图的 D3D11_MAP 枚举以跳过复制到暂存纹理?

编辑001: 好的,这里有案例,有技术细节。有一个解码器,本质上是 Intel Media SDK 解码器,它解码(双关语)从解码外部提供的数据 class。所以,它接收一个缓冲区,执行它的魔法(异步)和 returns(通过 SyncOperation,如果我没记错方法名称的话)一个表面,实际上,在引擎盖下的 DX 纹理,由 Intel 管理分配器。我同步接收和复制纹理,但我想,只要稍加努力我就可以异步完成。表面源自池,因此,处理纹理不会停止解码器以继续工作。复制的数据驻留在一个结构中,该结构保存在环形缓冲区中,视频渲染器从中馈送。就是这样,以我的理解(有点,我必须注意)对GPU并行性没有损害。

如果你必须读取和写入,没有快速的方法,你通过强制同步点破坏 GPU/CPU 并行性,你会在 CPU 和 GPU 上产生许多空闲气泡。

CPU只能访问暂存池,所以是的,来回的临时资源是必需的。

为了性能,你应该考虑:

  1. 将您的技术调整为仅限 GPU
  2. 如果回读是唯一的方法,限制在脏的或必要的部分
  3. 尝试跨帧处理几个纹理,让 CPU 在落后几帧的版本上工作以保护并行性。