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

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

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

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

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

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

окна выводятся на экранное растровое изображение

Это правильно?

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

  • WM_ERASEBKGND
  • WM_PAINT

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

alt text

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

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

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

окна выводятся на экранное растровое изображение

Между тем, передний буфер останется неизменным.

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

Это правильно?

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

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

1 голос
/ 03 декабря 2009

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

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

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

...