Когда новое изображение будет полностью сформировано в заднем буфере кадра

Пока старое изображение находится в переднем буфере кадра, новое изображение рисуется в заднем буфере кадра. С точки зрения программирования новое изображение рисуется на битовой плоскости в контексте памяти hdcMem.

Когда новое изображение будет полностью сформировано в заднем буфере кадра, оно практически мгновенно будет скопировано в передний буфер кадра, и тут же появится на экране. С точки зрения программирования копирование заднего буфера кадра в передний буфер кадра, означает копирование контекста памятиhdcMem в контекст окна hdcWin. Копирование осуществляется с помощью функции BitBlt().

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

      BitBlt(hdcWin, .., .., .., .., hdcMem, .., .., ..);

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

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

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

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

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