是一个关于重写update方法来做双缓冲的问题,在马士兵的tankWar教程上面看到这么一段代码。
主要看update和paint方法。意思我都懂,创建update方法里面创建一个图片,用图片的画笔把所有东西画进去,然后把图片的东西显示在frame上面。
问题就在用画笔画东西的地方,画东西之前,先要通过画一个绿色的方块把图片都遮盖起来,使得图片整个颜色重新变成绿色,再重画,个人觉得这样是不是有点消耗内存,因为之前画的东西都没有真正的释放掉,只是用绿色的方块给遮盖住了。
如果每次调用update的时候重新创建一个Image,把颜色改为绿色再画,不是跟好么,但是这样会比较消耗性能,到底怎么做比较好
Image offScreenImage = null;
public void update(Graphics g) {
if(offScreenImage == null) {
offScreenImage = this.createImage(800, 600);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, 800, 600);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(X, Y, 30, 30);
g.setColor(c);
this.Y += 5;
}
public void lauchFrame() {
this.setSize(WIDTH, HEIGHT);
this.setLocation(200, 200);
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setTitle("TankWar");
this.setBackground(Color.GREEN);
new Thread(new PaintThread()).start();
}
class PaintThread implements Runnable {
public void run() {
while(true) {
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
}
}