一般来说,在gdi中,对窗口的进行绘图和刷新图像会用到hdc设备上下文句柄,形式一般如下:
HDC hdc = NULL;
hdc = GetDC(HWND);
得到hdc后就可以对窗口进行各种图形操作。但是在游戏编程中如果原本属于同一帧的图形被分别放在了显卡的2个刷新周期,就会导致窗口显示的内容在人眼看起来时不时闪烁。解决这个问题我们可以使用双缓冲技术。
双缓冲技术的原理是声明一个内存DC,用来接受我们的各种绘图操作,所有操作完成之后我们再一次性的把内存DC的内用整体转移到视频DC,这样就可以保证属于同一帧的元素在一个刷新周期内被显示。具体如下:
hdc = GetDC (main_hwnd);//获得某一个窗口的设备上下文,即视频DC
phdc = ::CreateCompatibleDC(hdc);//通过视频DC建立一个与之兼容的内存DC
HBITMAP hbmp = ::CreateCompatibleBitmap(phdc,x,y);//为这个内存DC建立一个与之兼容的位图,xy为大小
::SelectObject(phdc,hbmp);//将位图选到内存DC中
到这里我们的内存DC就可以开始用了。使用方法很简单,例如画一些矩形
FillRect (phdc, &rect, hBrush) ;
等到对phdc的全部绘图操作完成之后我们就可以将phdc上的内容一次性复制到hdc中。使用方法如下
::BitBlt(hdc,0,0,490,490,phdc,0,0,SRCCOPY);//hdc为目标dc,phdc为源dc,srccopy为转移类型,其他是尺寸参数。就这样,我们会发现原本抖动现象现在已经消失了。
其实双缓冲技术就像是我们剪报,我们先声明一张白纸(内存dc),将报纸块剪下来之后先贴到白纸上,完成排版后我们再拿去影印(视频dc)。