Реализация двойного буферизации? - PullRequest
1 голос
/ 07 октября 2011

Я делаю игру и пытаюсь найти лучший способ внедрить в нее Doublebuffering. Кто-нибудь сможет показать мне, как я могу сделать это с моим кодом рендеринга ниже?

public void paint(Graphics g){
    super.paint(g);


    Graphics2D g2d = (Graphics2D) g;


    g2d.drawImage(p.getImage(), p.getX(),p.getY(),null);

    //draw each ball object
        for(int i=0;i<balls.size(); i++){
             Ball tmp = (Ball) balls.get(i);
             g2d.drawImage(tmp.getImage(), tmp.getX(),tmp.getY(),null);
            }   
         //strings
         g2d.drawString("Score: "+score,50,20);
        }

Может кто-нибудь, пожалуйста, помогите, я был бы очень признателен.

Спасибо заранее.

1 Ответ

2 голосов
/ 07 октября 2011

Если вы используете Swing, вы можете использовать встроенную двойную буферизацию: http://java.sun.com/products/jfc/tsc/articles/painting/#db

Если вы реализуете свой собственный рендеринг, вот несколько советов:

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

В вашем случае вы можете использовать изображение, чтобы нарисовать игровой контент, а затем нарисовать это изображение в компоненте. Это должно дать вам двойную буферизацию в некотором смысле. Вы можете использовать два изображения, которые вы меняете, чтобы уменьшить одновременный доступ, то есть одно будет «передним» буфером, который отображается, а другое - «обратным» буфером, к которому вы рисуете.

Тем не менее, я настоятельно рекомендую не реализовывать это самостоятельно. Вместо этого вам следует попробовать использовать одну из существующих 2D-библиотек (например, Swing) или 3D-библиотеки (например, OpenGL с JOGL или LWJGL в качестве привязок Java - обратите внимание, что это не обязательно должно быть 3D с OpenGL). В качестве альтернативы вы также можете найти игровой движок, там их много.

...