`
约巴拿
  • 浏览: 18944 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

绘图中的双缓冲

阅读更多
       一、产生双缓冲的原因
   
     为什么我们要用到双缓冲呢?因为它能满足我们的需要。什么需要?这个对于经常做一些游戏动态画面的我们来说,是深有体会的。我们经常会发现动态的游戏画面会出现闪烁的现象。这不是我们希望看到的。为什么会有这种现象。据说,这是由于我们要做动态画面时,会用到重绘方法,即repaint()。而每次调用这个方法,就会调用里面的dataup()方法,这个就会刷新界面,即把原来的画面用一张白纸代替,再在这张白纸上画出程序正在运行的新的要执行的指令要求的图像画面。这样就会产生一个过程,即擦掉原来的图像,用白纸代替后又画上新的图像。而这个用白纸代替后画图形的过程,在我们的眼睛看来就是“闪烁”。所以为了解决这个问题,绘图的双缓冲方法就应运而生了。



          二、双缓冲的原理以及使用方法

      原理:根据上面讲到的闪烁的原因,解决问题的关键是不要让我们的眼睛看到那个用白纸代替后画图的过程。所以就有了这个方法:创建一个缓冲图片,在缓冲图片中画图,再把这个已经完全画好的缓冲图片画到界面上去。缓冲图片是我们看不见的,在它上面绘图是在计算机后台运作的。

       使用方法:其实在原理中已经讲到了。这里就演示几行代码,其中的意思也就很明了了。

// 定义绘制方法
public void draw() {
  // 创建一个图片缓存区
BufferedImage bImage = new BufferedImage(this.getWidth(),
          this.getHeight(), BufferedImage.TYPE_INT_RGB);
  // 获取缓存区画布
Graphics g = bImage.getGraphics();
  // 设置画笔颜色
g.setColor(Color.GRAY);
  // 将屏幕填充为画笔颜色
g.fillRect(0, 0, width, heigth);//width和heigth是我们在一个类中定义的int型变量,我们可以创建一个线程类,重写其中的run()方法,使得width和heigth的值每隔几十或几百毫秒变化一次,这个可以通过调整Thread.sleep(int time)方法中的time值来实现。用start()方法启动这个线程,这样当我们用一个对象来调用这个这个draw()方法时,就能够画出很多不同位置的矩形了。
  // 获取窗体画布
Graphics gra = this.getGraphics();
  // 将缓存区图片画到窗体上
           gra.drawImage(bImage, 0, 0, null);

}
正像前面注释部分提到的一样,我们可以在一个类中实例化一个对象来调用这个draw()方法,这样就不会产生闪烁的动态图像了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics