ID3D11DeviceContext ::地图性能下降

ID3D11DeviceContext ::地图性能下降

问题描述:

我使用桌面复制到屏幕上的内容复制到内存中的位图。我收到桌面质地,然后创建一个临时的质感,使用CopyResource到桌面的纹理复制到临时纹理,最后调用ID3D11DeviceContext::Map访问分期质地位,并复制它们。几乎如这里所描述的一样:https://stackoverflow.com/a/27283837/825318ID3D11DeviceContext ::地图性能下降

的问题是,Map通话需要花费大量的时间 - 用于大型显示​​器的分辨率,如4K它可能需要长达100ms的每次通话,这是不可接受的,因为我需要确保30 fps的速度。

有没有什么办法让纹理的内容更快?如果没有,有没有办法提供我自己的映射地址指针,以便系统在那里复制纹理数据?由于

+1

[ID3D11DeviceContext :: Map](https://msdn.microsoft.com/en-us/library/windows/desktop/ff476457(v = vs.85).aspx)文档讨论性能损失,并建议适当的策略和页面的结尾。其中之一是使用易失性指针。 – 2016-11-25 16:12:22

+0

谢谢,但是这只适用于只写表面,而我的任务是从表面读取数据。 – Isso

最有可能的地图操作等待的CopyResource完成。您可以使用GPUView来验证这一点。如果是这种情况,那么推荐的解决方案是接受延迟而不是帧率。处理这个问题的方法是保持至少3层分期的纹理和通过以下方式在它们之间旋转:

帧#1 - 开始复制的资源,以举办纹理#1

帧#2 - 开始复制资源分期纹理#2

帧#3 - 开始复制资源到分段纹理#3和映射分段纹理#1访问数据

帧#4 - 开始复制资源到分段纹理#1(旧的内容应该已经被保存)并映射分级纹理#2以访问数据

这样你可以保持30 FPS,但引入〜130毫秒的延迟,这是大多数应用程序可以接受的。

+0

谢谢!不幸的是我需要最小的延迟,所以你的解决方案并没有真正解决我的问题,但这是一个聪明的方法,GPUView似乎是一个非常有用的工具。因此我向你奖励赏金。 – Isso

+1

如果您想要最小延迟,那么您基本上需要将CPU与GPU同步,以确保复制完成后立即读取纹理。这意味着GPU和CPU不能并行工作,这正是您在原始问题中所看到的。 如果我错过了一些东西,请让我知道它看起来像你试图满足两个相反的要求。 – moradin