C语言游戏编程:GDI怎么实现双缓冲绘图去掉闪烁

在上篇文章中将我要用C语言重新写一个俄罗斯方块,使用的是GDI的绘图模式(目前正在移植到DX上去,想添加一些更好友好的动画)。数据与动画分离,动画的帧率保持在30左右。但是绘图的时候画面出现了强烈的闪动。

排查了一下原因,不是由于电脑性能的原因(如果画几个线就闪的话那就糟了),而是由于采用的动画方式导致的。我采用的是擦除,绘制,擦除,绘制的模式。没有使用双缓冲。要解决画面闪烁,就要使用到双缓冲。

双缓冲指的是在创建两个一样大小、一样色深的表面。一个表面供你显示,一个供你作图,轮流交换。这样每次就可以直接扫描画好的表面到屏幕就OK了,不会出现闪烁的情况。更多双缓冲的知识你可以谷歌一下:)

使用DX的双缓冲非常容易,因为其内置了双缓冲的良好接口。但是怎么在GDI下使用双缓冲呢?这是个问题。最后在谷歌上找到了答案。

就是使用这几个函数CreateCompatibleDC, CreateCompatibleBitmap, BitBlt。

第一个函数CreateCompatibleDC在内存中创建一个单色的显示表面作为后备缓冲,第二个函数CreateCompatibleBitmap将你创建的后备缓冲设置成和你窗口设备环境一样大小、一样色深的表面,作为后备表面。第三个函数BitBlt将后备缓冲的内容拷贝到显示表面中去。

下面是一个实现GDI下双缓冲的代码:

/*** current_hdc为当前的窗口的hdc 使用GetDC得到** buffer_hdc 为后备缓冲 使用CreateCompatibleDC创建*/HDC current_hdc,buffer_hdc;current_hdc = GetDC(window_handle);/*** 初始化工作** 将buffer_hdc创建为和当前窗口hdc一样大小和一样色深** 记得要使用SelectObject函数** 该函数将CreateCompatibleBitmap创建的bmp** 设置到buffer_hdc中去,使得和current_hdc一样大小** 一样色深*/buffer_hdc = CreateCompatibleDC(NULL);HBITMAP bmp = CreateCompatibleBitmap(current_hdc,WINDOW_WIDTH,            WINDOW_HEIGHT);SelectObject(buffer_hdc,bmp);/* ... 其他的代码 *//* 绘图 在buffer_hdc后备缓冲中绘制 */LineTo(buffer_hdc,100,100);/*** 将后备缓冲的内容显示到窗口** 使用bitblt函数*/BitBlt(current_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,          buffer_hdc,0,0,SRCCOPY);/* 至此整个GDI下的双缓冲就实现了 */

文章中可能写得不是特别详细。下面是一个简单的示例程序,使用双缓冲在窗口上画几条直线,你可以试试不使用双缓冲,看看那是怎么样的效果。当然你还有疑问可以联系我:大笨兔

GDI实现双缓冲demo

若非注明,均为原创文章,转载请注明: 转载自大笨兔

本文链接地址: C语言游戏编程:GDI怎么实现双缓冲绘图去掉闪烁

想念我的时候,不要忘记我也在想念你。

C语言游戏编程:GDI怎么实现双缓冲绘图去掉闪烁

相关文章:

你感兴趣的文章:

标签云: