CodeMap

慎言笃行

导航

VC下的双缓冲解密

       要了解双缓冲问题,首先要了解动画的原理,动画从根本上讲是多幅静态图片的连续播放,连贯的静态图片快速切换便给人以动态的“错觉”。在两帧图片之间,还需要做些刷新工作,以消除下一帧不需要的元素,最简单的刷新就是“画白”或称为“清空”,这就是问题产生的根源,这一刷新如果是被观众看见,便是“闪烁”,因为有一时刻画面是空白的,见下一程序的演示:
       jumpball1.exe
       可见,欲消除“闪烁”,关键是消除“空白”,但是“清空”是不可免除的,不然跑动的人物也许会变成八爪鱼,即拖影;解决办法便是“双缓冲”,即在内存中开辟一与显存等大的单元,将原本在显存中完成的刷新工作转移至该内存中完成,最后一次性写入显存,这样在视觉上便避免了“空白”过程。
      在WIN32 API中,提供了高效的Bitblt函数,可实现Bitmap结构的快速搬移。本文基于该函数和“双缓冲”原理,实现了连续动画,消除了“闪烁”:
       jumpball2.exe
       读者可对比 jumpball1(“闪烁”) 和  jumpball2 (无“闪烁”),并可下载完整源代码,直观的了解这种机制的实现方法。

posted on 2006-11-07 13:04  wqlblogger  阅读(1101)  评论(1编辑  收藏  举报