Высокая загрузка ЦП с разным интервалом времени ожидания между получением кадров в Desktop Duplication API

Я пытаюсь захватить экран с 16 мс тайм-аута, и я получаю 60-65 FPS, когда захват проверяется на полноэкранном видео 4k 60fps. Загрузка ЦП в этом случае составляет приблизительно 0-1%. Но когда курсор мыши перемещается по экрану, FPS и загрузка процессора возрастают до 100+ кадров и 25-30% соответственно. Итак, возникает вопрос: почему я могу получить FPS больше 70, если таймаут установлен на 16?

Если для тайм-аута установлено значение 0: количество кадров в секунду фиксируется с то же значением, но использование ЦП остается стабильным на уровне 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);

person KKomrade    schedule 07.11.2019    source источник


Ответы (1)


Ответ находится в AcquireNextFrame документации:

AcquireNextFrame получает новый кадр рабочего стола, когда операционная система либо обновляет растровое изображение рабочего стола, либо меняет форму или положение аппаратного указателя. В новом кадре, который AcquireNextFrame получает, может быть обновлено только изображение рабочего стола, обновлена ​​только форма или положение указателя или и то, и другое.

Когда вы перемещаете мышь, вы получаете обновление от Desktop Duplication API до истечения времени ожидания. Таким образом, у вас будет больше обновлений, чем предполагает значение времени ожидания.

Что касается аномально высокой загрузки ЦП, то, скорее всего, это проблема с API: да, движения мыши связаны с чрезмерным потреблением ЦП без видимой причины. Возможно, какая-то проблема, связанная с блокировкой спина.

person Roman R.    schedule 07.11.2019
comment
Должен ли я использовать что-то вроде TimerQueueTimer или Sleep, если я хочу взять как можно больше кадров с тайм-аутом 16 и без высокой загрузки ЦП из-за движений курсора мыши? Или есть что-то лучше? - person KKomrade; 07.11.2019
comment
Насколько я помню, всплеск процессора не вызван вашим циклом напрямую. То есть я бы не ожидал, что сон решит проблему с процессором. Да, вы определенно можете спать, чтобы игнорировать лишние обновления и приблизиться к целевому FPS. - person Roman R.; 07.11.2019