![](/img/trans.png)
[英]Is there a way to convert an SDL_Surface to a Raylib Texture2D?
[英]The fastests way to copy to and from Texture2D
由于某种原因,我必须从纹理复制到缓冲区,然后将其重新加载回纹理。 源纹理是来自解码器的纹理,目标纹理是将要渲染的纹理。 (据我所知)最简单的方法是执行以下操作:
ID3D11Texture2D
) Usage = D3D11_USAGE_STAGING
) CopyResource
到临时纹理 memcpy
_s进行缓冲 Unmap
另一方面,它向后退
Usage = D3D11_USAGE_STAGING
) Map
memcpy_s
Unmap
CopyResource
到渲染器纹理 效果很好,但是我感觉我并没有做到尽可能高效(除了我来回复制数据的事实外)我是否必须使用临时纹理? 是否可以调整解码器/渲染器纹理标志(BindFlags?)或地图的D3D11_MAP枚举以跳过复制到过渡纹理的操作?
EDIT001:好的,这里有技术细节。 有一个解码器,本质上是Intel Media SDK解码器,它对从解码类外部提供的(双关)数据进行解码。 因此,它接收一个缓冲区,(异步地)执行其操作,然后返回(通过SyncOperation,如果我还记得方法名的话)一个表面,该表面实际上是在DX纹理下由Intel分配器管理的。 我同步接收和复制纹理,但是我想,只要稍作努力,就可以异步完成它。 表面起源于一个池,因此,使用纹理不会停止解码器继续工作。 复制的数据驻留在保留在环形缓冲区中的结构中,视频渲染器从环形结构中馈入。 就我所知(就是我要注意的一点),对GPU并行性没有害处。
如果必须进行读写操作,则没有快速的方法,可以通过强制同步点来破坏GPU / CPU并行性,并且会在CPU和GPU上创建许多空闲的气泡。
CPU仅可访问临时池,因此是的,来回的临时资源是必需的。
为了提高性能,您应该考虑:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.