J2ME Canvas的Double Buffer
Double buffer(双缓冲)曾经是游戏编程中常用的一个技巧,可以使动画更平滑,它的原理很简单,就是在刷新显示时,先在内存中作图,再从内存“拷贝”到真正的显示设备上,通常拷贝比直接绘图要快,因此这个方法可以显著提高显示切换的速度,做到平滑的显示效果,因为要准备一个内存中额外的缓冲,所以这种方法通常被称为双缓冲(Double buffer)。
J2ME中的UI部分,如果使用低级的Canvas来做用户界面的话,Canvas仅仅提供了一些最基本的绘图操作(线,框,填充等),要支持象按钮,列表等这些UI控件的话,不免要自己来做绘制了,这时Double Buffer就可以派上用场了。在有些平台上,Double Buffer已经内嵌就支持了,我在Sun的模拟器和N73上实测的结果是这两个平台已经都支持了Double Buffer,无需再写代码去实现额外的显示缓冲了,在Symbian S60的网站上也找到了一篇文章证实了我的猜测。
这里的一篇文章详细介绍了在使用Canvas时如何使用Double Buffer,还提供了一个动画的例子程序,这个例子代码使用了Canvas的isDoubleBuffer接口来判断一个Canvas是否已经支持了DoubleBuffer,如果不支持的话,才自己分配一个buffer来做Double Buffer,如果已经支持了,那么直接绘图就可以了。但是代码中有一个明显的bug,这句话:
g.drawImage (offscreen, 0, 0, Graphics.TOP | Graphics.RIGHT);
需要改为:
g.drawImage (offscreen, 0, 0, Graphics.TOP | Graphics.LEFT);
不过这个语句只在Canvas不支持Double buffer才用到(用于buffer的拷贝),所以在模拟器上是没有影响的,我也是为了验证double buffer的效果,特地注释了前面的isDoubleBuffer的检测(强制使用代码实现的Double Buffer)才发现这个bug。
相关文章