java 双缓冲技术

1.java双缓冲技术是一种解决闪屏的技术,我们首先来看看闪屏是因为什么产生的?图像画到屏幕上的过程是:AWT->update()->paint(),有时候我们通过repaint()来调用paint(),其实也是产生了一个 AWT线程,然后通过AWT线程来调用update(),再由update()来调用paint()。我们再来看看update()的源代码:

 public void update(Graphics g) {
    if (isShowing()) {
    if (! (peer instanceof LightweightPeer)) {
    g.clearRect(0, 0, width, height);
    }
    paint(g);
    }
    }
我们可以看到g.clearRect(0, 0, width, height)这行代码,我们从而知道了update()在每次调用之前会有一个清屏,这就是闪烁产生的原因,知道了闪烁是由update()的清屏造成的,我们就可以重写update()函数,来避免闪烁了。

2.重写update(),我们先来看一下一段已经写好了的代码,然后在剖析其原理:

public void update(Graphics g)
 {
  if(null==bkImage) { bkImage=this.createImage(640,500); }//定义一个屏幕外的图像
  Graphics gBkImg=bkImage.getGraphics();//获取屏幕外的图像的画笔
  gBkImg.clearRect(0, 0, 640, 500);//清空屏幕外的图像
  this.paint(gBkImg);   //将图像画到屏幕外的图像上

 g.drawImage(bkImage, 0, 0, 640, 500, this);//将屏幕外的图像画到屏幕上
 }

Java中,可以通过createImage()创建一幅屏幕外的图像(存在内存中),可以通过Image.getGraphics()来获取一个用来绘制屏幕外图像的画笔。然而我们知道在第二幅图片绘画之前必须清空第一幅图片,要不两张图片就会重合产生交叉,这也就是update()清屏的原因,但是我们又不能直接在屏幕上清屏,所以,我们可以通过gBkImg.clearRect(0, 0, 640, 500),将前一幅图片在内存中清空,这样就不会影响到屏幕了,然后再将图像画到屏幕外的图像上,最后将将屏幕外的图像画到屏幕上,就实现了画图的功能。(在最后将屏幕外的图像绘制到屏幕上的时候,前一幅图片会被自动垃圾回收,这是我的猜想,有待高手来解答)

posted @ 2011-10-13 08:16  xiao秋  阅读(2227)  评论(0编辑  收藏  举报