Двойная буферизация кажется прерывистой

Я пытаюсь реализовать двойную буферизацию для игры, но не уверен, что делаю это правильно.

Я вызываю 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 Проблема, с которой я столкнулся, заключается в том, что кажется, он работает хуже, чем до того, как у меня была двойная буферизация. Иногда элементы зависают на полсекунды, затем снова включаются, и все работает нормально, затем это происходит снова в течение нескольких минут (или меньше).


person Get Off My Lawn    schedule 11.05.2013    source источник
comment
Может начаться сборка мусора. Должна быть опция свойства, чтобы сделать ее непрерывной.   -  person huseyin tugrul buyukisik    schedule 12.05.2013
comment
g.drawImage(bg, 0, 0, это); Должно быть сделано на go.getsprite, чтобы избавиться от двойной прорисовки. Вы должны сделать это на заднем изображении, где его не видно.   -  person huseyin tugrul buyukisik    schedule 12.05.2013
comment
Несколько рисунков на спрайте, но один рисунок на экране этим спрайтом. Работает ли go.getSprite().drawImage(a,x,y,this)?   -  person huseyin tugrul buyukisik    schedule 12.05.2013
comment
Рассматривали ли вы вместо этого использование активной живописи? Подобно тому, что Хусейн предложил ниже. В основном отключите перерисовку и вручную рисуйте все на каждом игровом тике.   -  person Nikki    schedule 12.05.2013


Ответы (1)


Создайте изображение, создайте буфер для этого изображения, затем выполните все отрисовки в буфере, чтобы оно не отображалось на экране для каждой отдельной операции рисования. Когда все сделано для всего кадра, вы рисуете это изображение на экране.

В инициализации:

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

В части рисования (все, что вы хотите в буфере):

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

На экране рисования, когда все сделано:

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

Если это не устраивает, есть и тройная буферизация.

person huseyin tugrul buyukisik    schedule 11.05.2013