繁体   English   中英

在Texture2D之间进行复制的最快方法

[英]The fastests way to copy to and from Texture2D

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

  1. 解码器tex( ID3D11Texture2D
  2. 使用临时纹理( Usage = D3D11_USAGE_STAGING
  3. CopyResource到临时纹理
  4. '地图'
  5. memcpy _s进行缓冲
  6. Unmap

另一方面,它向后退

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

效果很好,但是我感觉我并没有做到尽可能高效(除了我来回复制数据的事实外)我是否必须使用临时纹理? 是否可以调整解码器/渲染器纹理标志(BindFlags?)或地图的D3D11_MAP枚举以跳过复制到过渡纹理的操作?

EDIT001:好的,这里有技术细节。 有一个解码器,本质上是Intel Media SDK解码器,它对从解码类外部提供的(双关)数据进行解码。 因此,它接收一个缓冲区,(异步地)执行其操作,然后返回(通过SyncOperation,如果我还记得方法名的话)一个表面,该表面实际上是在DX纹理下由Intel分配器管理的。 我同步接收和复制纹理,但是我想,只要稍作努力,就可以异步完成它。 表面起源于一个池,因此,使用纹理不会停止解码器继续工作。 复制的数据驻留在保留在环形缓冲区中的结构中,视频渲染器从环形结构中馈入。 就我所知(就是我要注意的一点),对GPU并行性没有害处。

如果必须进行读写操作,则没有快速的方法,可以通过强制同步点来破坏GPU / CPU并行性,并且会在CPU和GPU上创建许多空闲的气泡。

CPU仅可访问临时池,因此是的,来回的临时资源是必需的。

为了提高性能,您应该考虑:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM