我正在使用桌面复制将屏幕内容复制到内存中的位图中。我收到桌面纹理,然后创建暂存纹理,使用 CopyResource
将桌面纹理复制到暂存纹理中,最后调用 ID3D11DeviceContext::Map
访问暂存纹理位和复制它们。与此处描述的方式几乎相同:https://stackoverflow.com/a/27283837/825318
问题是 Map
调用需要花费大量时间 - 对于 4K 等大型显示分辨率,每次调用最多可能需要 100 毫秒,这高得令人无法接受,因为我需要确保 30 fps速度。
有没有什么办法可以更快的获取贴图的内容?如果没有,有没有办法提供我自己的映射地址指针,以便系统将纹理数据复制到那里?谢谢
最佳答案
很可能 Map 操作正在等待 CopyResource 完成。您可以使用 GPUView来验证这一点。如果是这种情况,那么推荐的解决方案是接受有利于帧速率的延迟。处理这个问题的方法是保留至少 3 个暂存纹理并按以下方式在它们之间旋转:
frame#1 - 开始将资源复制到暂存纹理#1
frame#2 - 开始将资源复制到暂存纹理#2
帧#3 - 开始将资源复制到暂存纹理#3 并将暂存纹理#1 映射到访问数据
frame#4 - 开始将资源复制到暂存纹理 #1(旧内容应该已经保存)并映射暂存纹理 #2 以访问数据
通过这种方式,您可以保持 30 FPS,但会引入约 130 毫秒的延迟,这对于大多数应用程序来说都是可以接受的。
关于c++ - ID3D11DeviceContext::Map 性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40808759/