gpt4 book ai didi

c++ - 向 Texture2D 复制和从 Texture2D 复制的最快方式

转载 作者:行者123 更新时间:2023-11-30 02:27:30 29 4
gpt4 key购买 nike

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

  1. 解码器 tex(ID3D11Texture2D)
  2. 使用临时纹理(Usage = D3D11_USAGE_STAGING)
  3. CopyResource 到临时纹理
  4. “ map ”
  5. memcpy_s 缓冲
  6. 取消映射

另一边倒退

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

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

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

最佳答案

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

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

为了性能,你应该考虑:

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

关于c++ - 向 Texture2D 复制和从 Texture2D 复制的最快方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41616962/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com