基于双缓冲技术的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++界面绘图,尤其是窗口老闪,强烈建议试试双缓冲,代码不复杂,效果还挺的。
146.54KB
文件大小:
评论区