GDI中利用双缓冲防止画面抖动

一般来说,在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)。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值