#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
и т.д.