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