基于双缓冲技术的VC++图形刷新原理与实现

双缓冲技术的图形刷新,真的是做 VC++窗口绘图时一个挺实用的优化点。以前用单缓冲绘图,一刷新就闪得厉害,眼睛都看花。双缓冲的做法呢,就是先在内存里画好,一步再统一贴到屏幕上,整个过程看起来就流畅多了,效果干净利落。

VC++的OnPaint你肯定不陌生,默认是先擦背景再画内容,所以频繁刷新的时候,就容易出现“白一下又画出来”的问题。其实问题不在刷新频率,而是每帧中间那一闪。想?嗯,双缓冲上!

你只要搞个后备 DC,用CreateCompatibleDC创建一个内存里的画布,再配个CreateCompatibleBitmap当底板,把所有绘图操作都往这张图上画。画完用BitBlt一把拷贝到前端 DC 上,画面就干净利索,一点不闪。

像下面这种写法就比较标准:

CDC* pMemDC = new CDC;
pMemDC->CreateCompatibleDC(&clientDC);
CBitmap* pBitmap = new CBitmap;
pBitmap->CreateCompatibleBitmap(&clientDC, width, height);
pMemDC->SelectObject(pBitmap);

// 这里开始画图 pMemDC->FillSolidRect(...); // ...其它绘图操作...

// 一次性拷贝到屏幕上 clientDC.BitBlt(0, 0, width, height, pMemDC, 0, 0, SRCCOPY);

// 资源别忘了释放 delete pBitmap; delete pMemDC;

这套方式适合那种需要实时刷新的窗口,比如动态图表、频繁重绘的编辑器界面。如果你还在用默认刷新的方法,那真挺可惜的。换成双缓冲,闪烁立马少一半。

另外,这边也有几个相关文章,深入了解也不错:

如果你在做 VC++界面绘图,尤其是窗口老闪,强烈建议试试双缓冲,代码不复杂,效果还挺的。

pdf 文件大小:146.54KB