我正试图用16ms的超时来捕捉屏幕,当在全屏4k 60fps视频上测试捕捉时,我得到了60-65 FPS。在这种情况下,CPU使用率大约为0-1%。但当鼠标光标在屏幕上移动时,FPS和CPU使用率分别上升到100+帧和25-30%。因此,有一个问题:如果超时设置为16,为什么我可以获得FPS大于70?
如果超时设置为0:使用相同的值捕捉的FPS量,但CPU使用率保持稳定在20-30%(即使屏幕上有静态图像(。在这种情况下,超时错误的数量显著增加。这在某种程度上与前面的问题有关吗?
do
{
hr = lDeskDupl->AcquireNextFrame(
TimeoutMS,
&lFrameInfo,
&lDesktopResource);
if (SUCCEEDED(hr)) {
accumFramesCount += lFrameInfo.AccumulatedFrames;
break;
}
if (hr == DXGI_ERROR_INVALID_CALL)
{
lDeskDupl->ReleaseFrame();
}
if (hr == DXGI_ERROR_WAIT_TIMEOUT)
{
timeoutsCount++;
}
}
while (true);
答案在AcquireNextFrame
文档中:
AcquireNextFrame
在操作系统更新桌面位图图像或更改硬件指针的形状或位置时获取新的桌面帧。AcquireNextFrame
获取的新帧可能只更新了桌面图像,只更新了指针形状或位置,或者两者都更新了。
移动鼠标时,会在超时之前从桌面复制API获得更新。通过这种方式,您可以获得比超时值所暗示的更多的更新。
至于异常高的CPU负载,很可能是API的问题:是的,鼠标移动与无明显原因的过度CPU消耗有关。也许是一些与旋转锁定相关的问题。