ID3D11DeviceContext ::地图性能下降
问题描述:
我使用桌面复制到屏幕上的内容复制到内存中的位图。我收到桌面质地,然后创建一个临时的质感,使用CopyResource
到桌面的纹理复制到临时纹理,最后调用ID3D11DeviceContext::Map
访问分期质地位,并复制它们。几乎如这里所描述的一样:https://stackoverflow.com/a/27283837/825318ID3D11DeviceContext ::地图性能下降
的问题是,Map
通话需要花费大量的时间 - 用于大型显示器的分辨率,如4K它可能需要长达100ms的每次通话,这是不可接受的,因为我需要确保30 fps的速度。
有没有什么办法让纹理的内容更快?如果没有,有没有办法提供我自己的映射地址指针,以便系统在那里复制纹理数据?由于
答
最有可能的地图操作等待的CopyResource完成。您可以使用GPUView来验证这一点。如果是这种情况,那么推荐的解决方案是接受延迟而不是帧率。处理这个问题的方法是保持至少3层分期的纹理和通过以下方式在它们之间旋转:
帧#1 - 开始复制的资源,以举办纹理#1
帧#2 - 开始复制资源分期纹理#2
帧#3 - 开始复制资源到分段纹理#3和映射分段纹理#1访问数据
帧#4 - 开始复制资源到分段纹理#1(旧的内容应该已经被保存)并映射分级纹理#2以访问数据
这样你可以保持30 FPS,但引入〜130毫秒的延迟,这是大多数应用程序可以接受的。
[ID3D11DeviceContext :: Map](https://msdn.microsoft.com/en-us/library/windows/desktop/ff476457(v = vs.85).aspx)文档讨论性能损失,并建议适当的策略和页面的结尾。其中之一是使用易失性指针。 – 2016-11-25 16:12:22
谢谢,但是这只适用于只写表面,而我的任务是从表面读取数据。 – Isso