Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Amerikano|Cls en 12 Mayo 2009, 08:30 am



Título: Duda Doble Buffer :(
Publicado por: Amerikano|Cls en 12 Mayo 2009, 08:30 am
Hola a todos, pues trata de que estoy desarrollando un pequeño juego en java de carros y pues cuando pego las imagenes y el bucle del juego me actualiza las nuevas posiciones, la imagen parpadea horrorosamente, pues bien se que esto se soluciona con la tecnica denominada doble buffering pero de lo que he consultado hasta el momento no me ha convensido, es decir no he entendido muy bien de que trata todo esto.

Lo que yo quiero es que al rotar la imagen del carro con el sigueinte code, no me de ese parpadeo molesto que aparece al actualizar la imagen. Mi duda es si debo crear un doble buffer por cada imagen que deba pintar, o con uno solo basta para todo??, mejor dicho no tengo ni palo de idea de como funciona el doble buffer y pues por eso recurro al foro para ver si alguien me saca de dudas :).

Código
  1. public void paint(Graphics g){
  2.  
  3. g2.setColor(new Color(60,60,60));
  4. g2.fillRect(0,0,getWidth(),getHeight());
  5.  
  6. at = AffineTransform.getRotateInstance(Math.toRadians(angulo),32, 32);
  7. atop = new AffineTransformOp(at,rh);
  8.  
  9. buffer = atop.filter(carro, null);
  10. g2.drawImage(buffer,200,200,this);
  11. }

De antemano 1000 gracias  ;D


Título: Re: Duda Doble Buffer :(
Publicado por: -Ramc- en 12 Mayo 2009, 16:48 pm
Mira, el doble búfer es como dibujar todo un cuadro de animación a un área no visible antes de copiarlo dentro de la ventana visible de un programa y el afuera de la pantalla sería el búfer.

Con el doble búfer entonces crea una superficie adicional(fuera de la pantalla, por decirlo así), construye todo el dibujo en esa área y al final dibuja toda la superficie  de gráficos al búfer que se está viendo.

El doble búfer utiliza mas memoría, por lo que debería intentar primero sobreponer el método update() y dibujar sólo porciones de la pantalla, con lo que puede que solucioné su problema, pero, si no funciona o quiere eliminar por casi completo el parpadeo de la aplicación entonces debe crear un objeto Image y uno Graphics adicionales.

Image off;
Graphics offscreen;

los inicializa.

off = createImage(getSize().width, getSize().height);
offscreen = off.getGraphics();

Y ahora siempre que vaya a dibujar que es regularmente en el método paint(), en vez de dibujar en el gráfico que recibe paint dibuja en el gráfico fuera de la pantalla, por ejemplo:

offscreen.drawImage(....);

Y al final de el método paint después de terminar todo el dibujado haces:

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

Y deberas sobreponer el método update para que no se limpie la pantalla entre cuadros.

Hace un rato que no dibujo nada en java, pero, hasta donde tenía entendido el segundo búfer no es eliminado por el recolector de basura, por lo que también tendras que usar métodos como dispose() para retirar explicitamente el objeto.

Espero que hayas entendido.


Título: Re: Duda Doble Buffer :(
Publicado por: ~~ en 12 Mayo 2009, 16:58 pm
Si quieres un ejemplo simple:
http://e0n-productions.blogspot.com/2008/11/pong-en-java.html

Aunque Java creo que ya incorpora api's propias para el doble buffer ;)


Título: Re: Duda Doble Buffer :(
Publicado por: Amerikano|Cls en 12 Mayo 2009, 18:12 pm
OK, muchas gracias a los 2, intentare hacerlo como me indican y luego comento como me fue  ;).

salu2


Título: Re: Duda Doble Buffer :(
Publicado por: Amerikano|Cls en 12 Mayo 2009, 19:41 pm
Ya lo solucione  ;D, el problema que tenia era que estaba pintando primero el doble buffer y enseguida pintaba el mundo, por esta razon parpadeaba  ;).

salu2 y gracias a los 2.