Реализация двойной буферизации?

#java #graphics #buffer

#java #графика #буфер

Вопрос:

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

 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:

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

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

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

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

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

Комментарии:

1. Я хочу сначала запустить встроенный метод, я покрасил страницу о двойной буферизации, которую вы мне дали, но там не сказано, с чего начать с JRootPane, не могли бы вы мне немного помочь?

2. @Duncan — с этой страницы: By default, this property is set to true for all Swing components. Таким образом, вам не нужно ничего делать. JRootPane Было бы доступно из JFrame и т.д.