我正在使用桌面复制 API中的AcquireNextFrame来捕获屏幕。屏幕刷新率为120Hz。以 120FPS 运行游戏时,屏幕截图可以以 120FPS 的速度捕获帧。但是当游戏的帧率增加到 240FPS 时,屏幕截图实际上下降到了 70FPS 左右。我的猜测是额外的帧正在累积,这会增加开销,但我不确定。有没有办法避免这种性能下降?
1 回答
设计的 Desktop Duplication API 会累积监视器(DXGI 术语中的“输出”)更新,直到您通过AcquireNextFrame
. 该 API 并非旨在首先捕获每个更新。此外,您没有指定是否在AcquireNextFrame
循环中执行其他任何操作,或者您只是测量性能(问题的语言建议后者)。
也就是说,如果使用非常密集的前端应用程序输出复制 API 会错过更新,这是很正常的。那里也没有太大的灵活性。ReleaseFrame
备注部分中提到的最重要的可用 MSDN 提示可能是:
出于性能原因,我们建议您在调用
IDXGIOutputDuplication::AcquireNextFrame
获取下一帧的方法。当客户端不拥有框架时,操作系统会将所有桌面更新复制到表面。如果操作系统为发生的每一帧更新相同的区域,这可能会导致浪费 GPU 周期。当客户端获取帧时,客户端只知道对该区域的最终更新;因此,前一帧中的任何重叠更新都被浪费了。当客户端获取帧时,客户端拥有表面;因此,操作系统只能跟踪更新的区域,而不能将桌面更新复制到表面。由于这种行为,我们建议您最小化调用释放当前帧和调用获取下一帧之间的时间。
也就是说,ReleaseFrame
更早或更晚的调用会影响 API 的内部行为。它要么在一般情况下累积更新,要么不断将实际有效负载数据复制到重复的帧资源中。