DXGI桌面复制屏幕捕获速度

时间:2018-01-16 09:41:23

标签: c++ winapi screen-capture dxgi desktop-duplication

我正在使用AcquireNextFrame中的Desktop Duplication API来捕获屏幕。屏幕刷新率为120Hz。当以120FPS运行游戏时,屏幕捕获可以捕获120FPS的帧。但是当将游戏的帧速率提高到240FPS时,屏幕截图实际上会下降到70FPS左右。我的猜测是额外的帧正在积累,增加了开销,但我不确定。有没有办法避免这种性能下降?

1 个答案:

答案 0 :(得分:6)

桌面复制API按设计累积监视器(DXGI术语中的“输出”)更新,直到您通过AcquireNextFrame请求它们。 API不是为了首先捕获每个更新而设计的。此外,您没有指定是否在AcquireNextFrame循环中执行任何其他操作,或者只是测量性能(问题的语言表示后者)。

也就是说,非常期望使用真正密集的前端应用程序输出重复API错过更新。那里没有太大的灵活性。也许MSDN在ReleaseFrame备注部分提到的最重要的提示:

  

出于性能原因,我们建议您在调用IDXGIOutputDuplication::AcquireNextFrame方法之前释放帧以获取下一帧。当客户端不拥有框架时,操作系统会将所有桌面更新复制到表面。如果操作系统为每个发生的帧更新相同的区域,这可能导致浪费的GPU周期。当客户端获取该帧时,客户端仅知道该区域的最终更新;因此,浪费了以前帧中的任何重叠更新。当客户获取框架时,客户拥有表面;因此,操作系统只能跟踪更新的区域,并且无法将桌面更新复制到表面。由于这种行为,我们建议您最小化释放当前帧的调用和获取下一帧的调用之间的时间。

也就是说,之前或之后调用ReleaseFrame会影响API的内部行为。它或者通常累积更新,或者将实际的有效载荷数据复制到重复的帧资源中。