J2ME的双缓冲技术(转)

关于J2ME中双缓冲技术:
双缓冲技术是编写J2ME游戏程序的关键技术之一。实际上,双缓冲技术是计算机动画的一项传统技术。造成屏幕闪烁的主要原因在于,画面在显示的同时程序又在改变它,于是画面闪烁。

解决办法是在内存中开辟一片区域作为后台画面,程序对它更新、修改,完成后再显示它。这样被显示的图像永远是已经完全画好的图像,程序修改的将不是正在被显示的图像。当然还有其他方法可以解决屏幕闪烁问题,但使用双缓冲技术是一种值得推荐的解决方案。

有些设备本身就支持双缓冲,每次都是先把屏幕重画在缓冲之中,然后再绘制在显示屏幕上,而不是直接绘制在显示屏幕上。可以使用Canvas类的isDoubleBuffer方法判断设备是否具有双缓冲。

可变图像可以很容易地用作屏幕外缓冲。改写前面绘制不变图像的代码,将所有的绘制都放在可变图像中,然后一次性地将可变图像绘制到屏幕上去。

  1. package doublebufferdemo;
  2. import javax.microedition.lcdui.*;
  3. import javax.microedition.midlet.*;
  4. import java.io.*;
  5. public class ImageCanvas extends Canvas
  6. {
  7.  
  8.    private Image buffer;                        //可变图像,作为绘制缓冲
  9.    private Image image;                          //不变图像,用来加载图片文件
  10.    public ImageCanvas()
  11.    {
  12.       try
  13.       {
  14.         image = Image.createImage("/tree.png")//加载图片文件
  15.       }catch(java.io.IOException e)
  16.       {
  17.         System.out.println(e.getMessage());      //处理I/O异常
  18.       }
  19.       buffer = Image.createImage(this.getWidth(), this.getHeight());
  20.                                                 //用一个可变图像作为绘制缓冲
  21.       Graphics bg = buffer.getGraphics();        //获取缓冲的Graphics对象
  22.       bg.setColor(0xFFFFFF);
  23.       bg.fillRect(0, 0, getWidth(), getHeight());    //填充整个屏幕
  24.       bg.drawImage(image,this.getWidth()/2,this.getHeight()/2,    <a href="http://www.sunjianyes.cn/Article/tag/graphics">Graphics</a>.VCENTER|Graphics.HCENTER);
  25.    }
  26.    public void paint(Graphics g)
  27.    {
  28.       g.drawImage(buffer,0,0,g.TOP|g.LEFT);      //将缓冲区上的内容绘制到屏幕上
  29.    }
  30. }

编译、运行程序,其结果和前面完全相同,但是却采用了双缓冲技术。对于双缓冲的使用,可以总结出以下几点。

* 定义一个Graphics对象bg和一个Image对象buffer,按屏幕大小建立一个缓冲对象赋给buffer,然后取得buffer的 Graphics对象赋给bg。在这里,Graphics对象可以理解为缓冲的屏幕,Image对象则可当成缓冲屏幕上的图片。

* 在bg(缓冲屏幕)上用drawImage()和drawString()等语句画图,相当于在缓冲屏幕上画图。

* 调用repaint()语句,它的功能是告知系统调用paint()来完成真实屏幕的显示。这里需要注意的是,paint()是一个系统调用语句,不能手工调用,只能通过paint()语句来调用。

* 在paint(Graphics g)函数里,将buffer(缓冲屏幕上的图片)画到真实屏幕上。

以上的步骤虽然看似繁琐,但是本身在不支持双缓冲机制的时候是必须的,回过头来看效果还是很不错的。如果想在屏幕上显示什么东西,只要画在bg上,然后调用repaint()将其显示出来就可以了。

posted on 2009-06-07 17:52 winlinglin 阅读(458) 评论(0)  编辑  收藏 所属分类: J2ME


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜