1

我正在尝试以16 毫秒的超时时间捕获屏幕,当在全屏 4k 60fps 视频上测试捕获时,我得到了60-65 FPS 。在这种情况下,CPU 使用率约为0-1%。但是当鼠标光标在屏幕上移动时,FPS 和 CPU 使用率分别上升了100+ 帧25-30%。所以,有一个问题:如果超时设置为 16,为什么我可以得到大于 70 的FPS ?

如果超时设置为 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);
4

1 回答 1

0

答案在AcquireNextFrame文档中:

AcquireNextFrame当操作系统更新桌面位图图像或更改硬件指针的形状或位置时,获取新的桌面框架。AcquireNextFrame获取的新框架可能只更新了桌面图像,只更新了指针形状或位置,或两者兼而有之

当您移动鼠标时,您会在超时之前从 Desktop Duplication API 获得更新。这样,您将获得比超时值所暗示的更多更新。

至于异常的高 CPU 负载,很可能是 API 的问题:是的,鼠标移动与 CPU 消耗过多有关,没有明显的原因。也许是一些自旋锁相关的问题。

于 2019-11-07T06:36:56.263 回答