双缓冲似乎不稳定

时间:2013-05-11 21:44:33

标签: java game-engine double-buffering

我正在尝试为游戏实施双缓冲,但我不确定我是否正确执行此操作。

我在主游戏循环中调用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我遇到的问题是,在我进行双重缓冲之前,它似乎运行得更糟。有时物品冻结半秒然后回升并且运行正常,然后在几分钟(或更短)内再次发生。

1 个答案:

答案 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); 

如果这些不满足,也有三重缓冲。

相关问题