图形的移动的时候不时会出现闪烁的现象,这是由于在同一个绘图表面上对图形进行反复绘制并擦除所导致的。
举例来说,一个绘制的小球,图形的绘制总是在Panle组件的Graphics对象上进行的,在绘制一幅小球的图形后马上更新小球坐标,接着调用repaint()方法擦除已有图形并绘制一幅新的图形。这一过程反复地、快速地进行着,于是就容易产生图形闪烁的现象。可以通过双缓冲机制解决这一问题。
双缓冲机制是借助两个不同的缓冲区来进行图形绘制,图形不是直接在显示设备所对应的缓冲区进行绘制,而是首先在后备缓冲区进行绘制,然后将后备缓冲区中的内容整体复制到设备缓冲区中,从而加快图形绘制速度并增强图形绘制的效果。
双缓冲机制包含两个过程,分别称作离屏绘制(Draw to Off-Screen)和前屏显示(Paint to On-Screen)。在离屏绘制阶段可以使用图像Image对象的缓冲去作为后备缓冲区(Back Buffer),在其中进行图形绘制,而在前屏显示阶段便可以将后备缓冲区的数据直接复制到设备缓冲区进行显示,设备缓冲区也叫前屏缓冲区或主界面(Primary Surface)。
离屏绘制步骤:
(1)建立一个Image对象
(2)获取其Graphics对象(缓冲区)
(3)设置绘制图形
(4)在Image上绘制图形
//定义一个gameRender()方法用来进行离屏绘制
public void gameRender() {
//建立Image对象,尺寸同于程序窗口大小
Image im = createImage(getWidth(),getHeight());
Graphics dbg = im.getGraphics(); //获取该图像的Graphics对象
dbg.setColor(Color.blue);
dbg.fillOval(x, y, diameter, diameter); //int型diameter为小圆的半径
}
以上程序采用图像缓冲区作为后备缓冲区,通过调用图像的getGraphics()方法来获取图像缓冲区的控制权,继而在其中绘制图形。
前屏显示步骤
(1)获取当前屏幕的Graphics对象
(2)复制Image图象缓冲区的内容
(3)释放当前屏幕的Graphics对象
//定义一个gamePaint()方法用来进行前屏显示
public void gamePaint() {
Image im = createImage(getWidth(),getHeight());
Graphics g = this.getGraphics();
g.drawImage(im,0,0,null);
g.dispose();
}
以上程序通过调用当前组件的getGraphics()方法获取对前屏缓冲区的控制权,接着调用drawImage()方法将图像缓冲区的内容复制到前屏缓冲区,该方法的第一个参数表示源图像对象,第二个和第三个参数分别表示目标区域左上角的横坐标和纵坐标。