Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在桌面复制API中采集帧之间,CPU使用率高,超时间隔不同_C++_Windows_Desktop Duplication_Dda - Fatal编程技术网

C++ 在桌面复制API中采集帧之间,CPU使用率高,超时间隔不同

C++ 在桌面复制API中采集帧之间,CPU使用率高,超时间隔不同,c++,windows,desktop-duplication,dda,C++,Windows,Desktop Duplication,Dda,我试图用16ms的超时时间捕获屏幕,当在全屏4k 60fps视频上测试捕获时,我获得60-65 FPS。在这种情况下,CPU使用率约为0-1%。但当鼠标光标在屏幕上移动时,FPS和CPU使用率分别上升到100+帧和25-30%。因此,有一个问题:如果超时设置为16,为什么我可以获得大于70的FPS 如果超时设置为0:捕获的FPS数量与相同,但CPU使用率保持在20-30%,即使屏幕上有静态图像。在这种情况下,超时错误的数量显著增加。这是否与前面的问题有关 do { hr = lDeskD

我试图用16ms的超时时间捕获屏幕,当在全屏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);

答案在
AcquireNextFrame
文档中:

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

移动鼠标时,会在超时时间过去之前从桌面复制API获得更新。这样,您的更新比超时值所暗示的要多


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

答案在
AcquireNextFrame
文档中:

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

移动鼠标时,会在超时时间过去之前从桌面复制API获得更新。这样,您的更新比超时值所暗示的要多


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

如果我想在16超时的情况下拍摄尽可能多的帧,并且不因为鼠标光标的移动而占用大量CPU,我应该使用TimerQueueTimer或Sleep之类的工具吗?或者有更好的吗?据我记忆所及,CPU峰值不是由循环直接引起的。也就是说,我不希望通过睡眠来解决CPU问题。是的,你当然可以通过睡眠来忽略过多的更新,并更接近目标FPS。如果我想在16超时的情况下尽可能多地拍摄帧,并且由于鼠标光标的移动而不占用大量CPU,我应该使用TimerQueueTimer或sleep之类的工具吗?或者有更好的吗?据我记忆所及,CPU峰值不是由循环直接引起的。也就是说,我不希望通过睡眠来解决CPU问题。是的,你绝对可以通过睡眠来忽略过多的更新,从而更接近目标FPS。