Требуется ли двойная буферизация при включенной композиции рабочего стола?
-
12-09-2019 - |
Вопрос
Требуется ли по-прежнему двойная буферизация при включенной компоновке рабочего стола?
В системе Microsoft Руководство по совместимости приложений:
Графический интерфейс устройства (GDI)
До Windows Vista и Windows Server 2008 дескриптор окна (HWND) выводился непосредственно на экран, что имело определенные преимущества, но ограничивало возможности Windows отображать окна верхнего уровня и управлять ими.В Windows Vista и Windows Server 2008 все окна верхнего уровня отображаются в виде растрового изображения за пределами экрана (аналогично WS_EX_LAYERED), а окно рабочего стола Менеджер объединяет изображения вместе для рисования рабочего стола.
Похоже, что весь рендеринг теперь выполняется с растровым изображением за пределами экрана:
окна отображаются в виде растрового изображения за пределами экрана
Правильно ли это?
Причина, по которой я спрашиваю, заключается в том, что я все еще вижу мерцание во время стандартного цикла рисования:
- WM_ERASEBKGND
- Сообщения WM_PAINT
пока включена композиция рабочего стола:
я бы предположил, что между звонками в
BeginPaint(hWnd, paintStructure);
...
EndPaint(hWnd, paintStructure);
что вся покраска будет происходить с задним буфером:
окна отображаются в виде растрового изображения за пределами экрана
При этом передний буфер a оставался бы незатронутым.
Решение
Правильно ли это?
Да (именно так миниатюры могут показывать вам части окна, которые в данный момент затемнены).
Рендеринг экрана в DWM выполняется с двойной буферизацией.Однако, если он захватывает ваш буфер, прекратите стирание и закрашивание...это будет проявляться как видимый артефакт.Таким образом, вам все равно нужно удвоить буфер.Двойная буферизация происходит на рабочем столе (т. е.он полностью отрисовывает следующий вид рабочего стола, а затем переворачивает), а не в закадровых буферах, к которым отрисовывается каждое окно.
Другие советы
Что ж, рисование в растровое изображение за пределами экрана просто позволяет DWM компоновать окна по своему усмотрению, не дожидаясь перерисовки приложения (как это имеет место, например, в XP, когда вы перемещаете окна поверх другого).
Это делает нет это означает, что рисование на этой поверхности за пределами экрана автоматически уменьшает мерцание.Если вы сотрете окно, а затем перерисуете его, и между обоими действиями DWM перерисует экран (что он делает примерно 60 раз в секунду), то, конечно, вы увидите мерцание.
Это действительно решает проблему "белых окон", когда приложение перерисовывается недостаточно быстро, а также уменьшает перерисовку из-за перекрывающихся окон.Но это не помогает от мерцания.DWM не может узнать, что ваша операция рисования еще не завершена и что вы хотите, чтобы старое изображение окна отображалось до тех пор, пока вы снова не нарисуете содержимое.