Способ вывода изображения на экран, рассмотренный выше, называется двойной

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

            Напомним, что в современных видеоадаптерах информация об изображении храниться в виде двухмерных массивов пикселей  в области памяти видеоадаптера, в видеопамяти. Такая область называется кадровым буфером (framebuffer), или буфером кадра. 

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

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

 В программеglopen03.cpp буферу кадра соответствует контекст окна hdcWin. 

      //получаемконтекстокна

      HDC hdcWin = GetDC(hwnd);

 

Когда программа рисует графический объект в контексте окна hdcWin, то одновременно информация о нем заносится в буфер кадра, и изображение объекта тут же появляется на экране.

            Поэтому, если для анимации использовать только один буфер кадра, то перед пользователем на экране будет происходить как удаление предыдущего изображения, так и появление нового изображения. Это приводит к мерцанию движущегося объекта.

            Для удаления эффекта мерцания в программе используется два буфера кадра. Первый буфер кадра находится в видеопамяти видеоадаптера, и называется передним буфером (frontbuffer). С этим буфером кадра связан контекст окна hdcWin.

            Роль второго буфера кадра  выполняет битовая карта hBitmap, которая располагается в операционной памяти. Этот буфер кадра называется задним буфером (backbuffer).   

      //создаем битовую карту совместимую с контекстом окна

      HBITMAP hBitmap = CreateCompatibleBitmap(hdcWin, .., ..);

 

С задним буфером кадра связан контекст памяти hdcMem.

      //создаем контекст памяти связанный с контекстом окна

      HDC hdcMem = CreateCompatibleDC(hdcWin);

      //помещаем битовую карту в контекст памяти

      HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMem, hBitmap);

 

 

 

Метод двойной буферизации сводится к следующему. Предыдущее изображение находится в переднем буфере кадра и с частотой 50 Гц обновляется на экране. С точки зрения программирования старое изображение находится в контексте окна hdcWin.

Ссылка на основную публикацию
Adblock detector