我正在尝试为游戏实施双缓冲,但我不确定我是否正确执行此操作。
我在主游戏循环中调用this.repaint()
,然后应该这样做:
@Override
public void paint(Graphics g){
// this.getWidth() / this.getHeight() is the window size
this.dbImage = createImage(this.getWidth(), this.getHeight());
this.dbg = dbImage.getGraphics();
this.paintComponent(dbg);
g.drawImage(this.dbImage, 0, 0, this);
}
@Override
public void paintComponent(Graphics g){
try{
g.drawImage(bg, 0, 0, this);
// gameObjects is an ArrayList with an object in it that represents
// an item on the screen, such as an enemy or a bullet
for(int i = 0; i < gameObjects.size(); i++){
GameObject go = gameObjects.get(i);
g.drawImage(go.getSprite(), go.getX(), go.getY(), this);
}
}catch(Exception e){
}
}
我基本上做了这个人在这里做的事情:YouTube Video我遇到的问题是,在我进行双重缓冲之前,它似乎运行得更糟。有时物品冻结半秒然后回升并且运行正常,然后在几分钟(或更短)内再次发生。
答案 0 :(得分:0)
创建一个图像,为该图像创建一个缓冲区,然后在缓冲区上进行所有绘图,这样就不会为每个绘图操作绘制屏幕。当完成整个帧的所有操作后,您现在可以在屏幕上绘制该图像。
在init中:
offscreen = createImage(dim.width,dim.height);
bufferGraphics = offscreen.getGraphics();
在绘图部分(无论你想要什么在缓冲区):
bufferGraphics.fillRect(20, 20+m,0,20);
完成所有操作后的绘图画面:
g.drawImage(offscreen,0,0,this);
如果这些不满足,也有三重缓冲。