ID3D11DeviceContext :: Map慢性能

Iss*_*sso 1 c++ windows directx desktop

我正在使用桌面复制将屏幕内容复制到内存中的位图.我接收桌面纹理,然后创建一个分段纹理,用于CopyResource将桌面纹理复制到分段纹理,最后调用ID3D11DeviceContext::Map访问分段纹理位并复制它们.几乎与此处描述的方式相同:https://stackoverflow.com/a/27283837/825318

问题是Map呼叫需要花费大量时间 - 对于像4K这样的大显示分辨率,每次呼叫可能需要100毫秒,这是不可接受的高,因为我需要确保30 fps的速度.

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

mor*_*din 5

很可能Map操作正在等待CopyResource完成.您可以使用GPUView来验证这一点.如果是这种情况,那么推荐的解决方案是接受有利于帧率的延迟.处理此问题的方法是保留至少3个分段纹理,并以下列方式在它们之间旋转:

帧#1 - 启动复制资源到暂存纹理#1

帧#2 - 启动复制资源到分段纹理#2

frame#3 - 启动复制资源到staging texture#3和map staging texture#1来访问数据

第4帧 - 启动复制资源到暂存纹理#1(旧内容应该已经保存)和映射登台纹理#2来访问数据

通过这种方式,您可以保持30 FPS但引入约130毫秒的延迟,这对大多数应用程序来说是可以接受