2013-05-11 49 views
1

我想实现一个游戏的双缓冲,但我不知道如果我正确地做它。双缓冲似乎不连贯

我在我的游戏主循环,调用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

可以将垃圾收集踢入。必须有一个属性选择,以使其连续。 – 2013-05-11 21:46:54

+0

g.drawImage(bg,0,0,this);应该在go.getsprite上完成摆脱双重绘图。你必须在没有看到的背景图像上进行。 – 2013-05-11 21:49:03

+0

在精灵上绘制多个图形,但在精灵屏幕上绘制单个图形。 go.getSprite()。drawImage(a,x,y,this)是否工作? – 2013-05-11 21:50:22

回答

0

创建一个图像,为该图像创建一个缓冲区,然后在缓冲区上进行所有绘制,以便它不会被绘制到每个绘图操作的画面。当全部完成整个画面时,您现在可以在屏幕上真实地绘制该图像。

在INIT:

offscreen = createImage(dim.width,dim.height); 
bufferGraphics = offscreen.getGraphics(); 

在绘图(无论你想在缓冲区)部分:

bufferGraphics.fillRect(20, 20+m,0,20); 

在绘制屏幕时,全部完成:

g.drawImage(offscreen,0,0,this); 

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