Прерывистый захват BitBlt

Я активно использую BitBlt в своем проекте. Я создаю несколько потоков и в каждом потоке захватываю экран с помощью BitBlt. Это прекрасно работает и, как и ожидалось, пока, за исключением следующей проблемы.

Проблема возникает, когда пользователь нажимает на запущенную программу или, например, на уже открытый проводник на панели задач. Вы знаете, когда вы нажимаете на запущенную программу на панели задач, она либо сворачивается, либо появляется на экране. Проблема, о которой я говорю, возникает именно в этом переходе. В этот момент, что-то вроде прерывания, все потоки прекращают захват экрана на долю секунды, а затем продолжают захват. То же самое происходит, когда вы перемещаетесь вниз или вверх в окне регулировки громкости. Не могли бы вы пролить свет на то, почему это происходит и как я могу предотвратить это?

Благодарю.

сойка

1 ответ

Решение

Это может быть проблема планирования. Когда вы активируете приложение, оно получает небольшое, кратковременное повышение приоритета (так что оно может показаться отзывчивым в пользовательском интерфейсе). Это усиление может длиться примерно столько же, сколько анимация и на мгновение опережает потоки захвата экрана.

Также возможно, что менеджер рабочего стола выполняет сериализацию, и ваши бит-биты просто останавливаются, пока анимация не закончится. Даже если вы выключили Aero, я думаю, что оконный менеджер рабочего стола все еще может находиться в режиме компоновки, что дает эффект, который Ханс Пассант описывал в комментариях.

Если вы пытаетесь сделать видео с экрана, я думаю, что будет невозможно полагаться на GDI. Я настоятельно рекомендую прочитать о диспетчере окон рабочего стола. Например, это предупреждение относится непосредственно к тому, что вы пытаетесь сделать:

Избегайте чтения или записи на дисплей DC. Хотя поддерживается DWM, мы не рекомендуем его из-за снижения производительности.

Когда вы используете GDI, чтобы попытаться прочитать экран, DWM должен остановить то, что он делает, возможно, отрисовать свежую копию рабочего стола в видеопамять и скопировать данные из видеопамяти обратно в системную память. Возможно, что DWM рассматривает их как запросы с более низким приоритетом, чем выполняемая анимация, поэтому к моменту ответа на BitBlt анимация заканчивается.

Этот вопрос говорит о том, что DirectShow с фильтром захвата экрана может быть правильным решением.

Другие вопросы по тегам