c++ - ID3D11DeviceContext::Map 性能低下

标签 c++ windows directx desktop

我正在使用桌面复制将屏幕内容复制到内存中的位图中。我收到桌面纹理,然后创建暂存纹理,使用 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/

相关文章:

windows - 在哪里可以找到好看的和 Vista 相似的用户界面图标?

c++ - 每个实例具有不同索引计数的 DrawIndexedInstanced (Directx11)

c++ - c++中矩阵的加法

c++ - 多个字符串存储在不同的变量 C++ 中

java - 用另一个按钮替换一个按钮

python 将文件保存到用户文件夹(Windows)

c# - 如何用C#.Net和DirectX编写音视频播放引擎(综合分析)?

c++ - DirectX 9 或 10 覆盖

c++ - 获取优先于提升进程的互斥量

c++ - Gotw 67 中的一个例子