![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzEvMy8zLzIvMzAvYTQxOTU0YTI3ZDZhZDk2ZmEyYzJjZjgxNmU2Nzc0NDguanBl.jpe?w=700&webp=1)
/** */
/**
*双缓冲
*什么是重量级,轻量级
*轻量级在这里指用纯java实现的。重量级指和其他语言混合编程,这样耗用的资源多系统触发的绘画操作
*绘画操作的分类
*系统触发的和程序触发的绘画操作
*AWT的绘制与界面更新使用了一个单独的线程,称为AWT线程。这个线程可以在两种情形下更新显示。
*一种情况是界面“显露”,这可能会发生在界面首次显示时,或者界面某一部分由于被其它窗口遮盖后重新显示时。界面显露的处理是AWT自动进行的,。
*第二种情况是程序在显示内容有所改变时进行界面的更新,而这一般是由应用程序的逻辑来控制的。
*
*repaint() update()paint()
*当我们应用程序的逻辑要对系统界面进行更新时,调用repaint() 方法来通知AWT线程进行刷新操作。repaint() 方法实际会让AWT线程去调用另外一个方法,update。update方法在默认情况下会做两件事,一是清除当前区域内容,二是调用其paint()方法完成实际绘制工作。
*第一个优化工作就是重写update() 方法,也就是不对当前区域进行清除工作,而直接进行绘制.
*paint(g)中的g代表屏幕对象,直接对代表屏幕对象的Graphics对象进行操作,而这个操作是比较费时的操作。解决的办法是采用“双缓冲”,即我们创建一个绘制缓冲区,以bufImage表示,先将主要的图形元素一个一个地绘制到此缓冲图像上,再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即paint() 方法传入的“g”上。
*
*paint(g);直接对代表屏幕对象的Graphics 对象进行操作,而这个操作是比较费时的操作。
*重写update()步骤:
*得到缓冲图象this.offScreenImage = this.createImage(800,600);
*看APIcreateImage用来创建一幅用于双缓冲的、可在屏幕外绘制的图像。
*得到缓冲图象的画笔Graphics offg = this.offScreenImage.getGraphics();
*绘制缓冲图象offg.setColor(Color.GREEN);
*调用paint(),将缓冲图象的画笔传入
*再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即该方法传入的“g” 上. g.drawImage(offScreenImage, 0, 0, null);
*双缓冲问题只在AWT中存在,spring中已解决
*/
import
java.awt.Color;
import
java.awt.Frame;
import
java.awt.Graphics;
import
java.awt.Image;
import
java.awt.event.WindowAdapter;
import
java.awt.event.WindowEvent;
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzUvMS8wLzIvMTYvNjgxMDM1NWMyZjc4YzEyZTkxYjc5OTdhOGU4YzU4M2EuanBl.jpe?w=700&webp=1)
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzEvMy8zLzIvMzAvYTQxOTU0YTI3ZDZhZDk2ZmEyYzJjZjgxNmU2Nzc0NDguanBl.jpe?w=700&webp=1)
public
class
TankClient
extends
Frame
...
{
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvOC8yLzUvNTMvNmE5YzA3MWEwOGYxZGFlMmQzZTFjNTEyMDAwZWVmNDEuanBl.jpe?w=700&webp=1)
private static final long serialVersionUID = 1L;
private int X = 50, Y = 50;
private int GAME_WIDTH = 800;
private int GAME_HEIGHT = 600;
private Image offScreenImage;
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvOC8yLzUvNTMvNmE5YzA3MWEwOGYxZGFlMmQzZTFjNTEyMDAwZWVmNDEuanBl.jpe?w=700&webp=1)
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
public static void main(String[] args) ...{
TankClient tc = new TankClient();
tc.launchFrame();
}
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvOC8yLzUvNTMvNmE5YzA3MWEwOGYxZGFlMmQzZTFjNTEyMDAwZWVmNDEuanBl.jpe?w=700&webp=1)
@Override
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
public void update(Graphics g) ...{
//1.得到缓冲图像
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
if(this.offScreenImage == null) ...{
this.offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
//2.得到缓冲图像的画笔
Graphics gOffScreen = this.offScreenImage.getGraphics();
//3.绘制缓冲图像
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
//4.调用paint(),将缓冲图象的画笔传入
paint(gOffScreen);
//5.再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即该方法传入的“g”上
g.drawImage(offScreenImage, 0, 0, null);
}
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvOC8yLzUvNTMvNmE5YzA3MWEwOGYxZGFlMmQzZTFjNTEyMDAwZWVmNDEuanBl.jpe?w=700&webp=1)
@Override
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
public void paint(Graphics g) ...{
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(X, Y, 30, 30);
g.setColor(c);
Y += 5;
}
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvOC8yLzUvNTMvNmE5YzA3MWEwOGYxZGFlMmQzZTFjNTEyMDAwZWVmNDEuanBl.jpe?w=700&webp=1)
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
public void launchFrame() ...{
this.setBounds(100, 100, GAME_WIDTH, GAME_HEIGHT);
this.setBackground(Color.GREEN);
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
this.addWindowListener(new WindowAdapter() ...{
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
public void windowClosing(WindowEvent e) ...{
setVisible(false);
System.exit(0);
}
});
this.setTitle("TankWar");
this.setResizable(false);
this.setVisible(true);
new Thread(new PaintThread()).start();
}
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvOC8yLzUvNTMvNmE5YzA3MWEwOGYxZGFlMmQzZTFjNTEyMDAwZWVmNDEuanBl.jpe?w=700&webp=1)
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
class PaintThread implements Runnable ...{
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvOC8yLzUvNTMvNmE5YzA3MWEwOGYxZGFlMmQzZTFjNTEyMDAwZWVmNDEuanBl.jpe?w=700&webp=1)
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
public void run() ...{
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
while (true) ...{
repaint();
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
try ...{
Thread.sleep(50);
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvMi81LzUvMTgvMzdjOGJmNjhjZGMzY2M4MTc1OWMzNDE2MDc3NmJjNTMuanBl.jpe?w=700&webp=1)
} catch (InterruptedException e) ...{
e.printStackTrace();
}
}
}
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzAvOC8yLzUvNTMvNmE5YzA3MWEwOGYxZGFlMmQzZTFjNTEyMDAwZWVmNDEuanBl.jpe?w=700&webp=1)
}
}
![JAVA中的双缓冲问题 JAVA中的双缓冲问题](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzMvNi8zLzYvODgvMDkwY2QyNWIwNzkyMDg5OTg4ZDQ1Y2JiOTAwNjE5MGUuanBl.jpe?w=700&webp=1)