Требуется ли двойная буферизация при включенной композиции рабочего стола?

StackOverflow https://stackoverflow.com/questions/1840516

Вопрос

Требуется ли по-прежнему двойная буферизация при включенной компоновке рабочего стола?

В системе Microsoft Руководство по совместимости приложений:

Графический интерфейс устройства (GDI)

До Windows Vista и Windows Server 2008 дескриптор окна (HWND) выводился непосредственно на экран, что имело определенные преимущества, но ограничивало возможности Windows отображать окна верхнего уровня и управлять ими.В Windows Vista и Windows Server 2008 все окна верхнего уровня отображаются в виде растрового изображения за пределами экрана (аналогично WS_EX_LAYERED), а окно рабочего стола Менеджер объединяет изображения вместе для рисования рабочего стола.

Похоже, что весь рендеринг теперь выполняется с растровым изображением за пределами экрана:

окна отображаются в виде растрового изображения за пределами экрана

Правильно ли это?

Причина, по которой я спрашиваю, заключается в том, что я все еще вижу мерцание во время стандартного цикла рисования:

  • WM_ERASEBKGND
  • Сообщения WM_PAINT

пока включена композиция рабочего стола:

alt text

я бы предположил, что между звонками в

   BeginPaint(hWnd, paintStructure);
   ...
   EndPaint(hWnd, paintStructure);

что вся покраска будет происходить с задним буфером:

окна отображаются в виде растрового изображения за пределами экрана

При этом передний буфер a оставался бы незатронутым.

Это было полезно?

Решение

Правильно ли это?

Да (именно так миниатюры могут показывать вам части окна, которые в данный момент затемнены).

Рендеринг экрана в DWM выполняется с двойной буферизацией.Однако, если он захватывает ваш буфер, прекратите стирание и закрашивание...это будет проявляться как видимый артефакт.Таким образом, вам все равно нужно удвоить буфер.Двойная буферизация происходит на рабочем столе (т. е.он полностью отрисовывает следующий вид рабочего стола, а затем переворачивает), а не в закадровых буферах, к которым отрисовывается каждое окно.

Другие советы

Что ж, рисование в растровое изображение за пределами экрана просто позволяет DWM компоновать окна по своему усмотрению, не дожидаясь перерисовки приложения (как это имеет место, например, в XP, когда вы перемещаете окна поверх другого).

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

Это действительно решает проблему "белых окон", когда приложение перерисовывается недостаточно быстро, а также уменьшает перерисовку из-за перекрывающихся окон.Но это не помогает от мерцания.DWM не может узнать, что ваша операция рисования еще не завершена и что вы хотите, чтобы старое изображение окна отображалось до тех пор, пока вы снова не нарисуете содержимое.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top