Uso del double-buffering software

2396 vistas

La visualización por defecto de un componente awt, swing,... de Java se hace con la ayuda de un simple buffer. Si realizamos animaciones un tanto complejas, se producirán parpadeos de la imagen. Para evitar este problema podemos usar el método del double-buffering. Básicamente, esta técnica consiste en tener un buffer donde se dibuja en memoria y otro que se ocupa de mostrarlo en pantalla.

Veamos un programa sencillo que usa el double-buffering.



java
  1. public class DoubleBufferingSoftware extends Frame{
  2.   // bucle de mostrado
  3.   RenderingThread renderingThread = new RenderingThread();
  4.   // buffer memoria (2do buffer)
  5.   Graphics buffer;
  6.   // image de memoria correspondiente al
  7.   Image image;
  8.   int x = 0; // coordenada x del texto
  9.  
  10.   public DoubleBufferingSoftware(){
  11.       // mostrado
  12.       setSize( 400, 400 );
  13.       setVisible( true );
  14.       // iniciamos el buffer de mostrado
  15.       renderingThread.start();
  16.   }
  17.  
  18.   public void update(Graphics g){
  19.       paint(g);
  20.   }
  21.  
  22.   public void paint( Graphics g ){
  23.     // creación de un buffer si no existe
  24.     if(buffer==null){
  25.         image = createImage(400,400);
  26.         buffer = image.getGraphics();
  27.       }
  28.     // dibujamos en el buffer de memoria
  29.       buffer.setColor( Color.white );
  30.       buffer.fillRect( 0, 0, 400, 400 );
  31.       buffer.setColor( Color.black );
  32.       buffer.drawString( "mostrar una línea de texto", x, 200 );
  33.       x++;
  34.       if(x>400) x = 0;
  35.       // finalmente, el buffer de momoria se dibuja en el de mostrado
  36.       g.drawImage(image, 0, 0, this);
  37.   }
  38.  
  39.   class RenderingThread extends Thread {
  40.     /**
  41.       *  Este thread llama al repintado de nuestra ventana
  42.       *  cada 10 milisegundos
  43.       */
  44.       public void run(){
  45.         while(true){
  46.             try {
  47.               repaint();
  48.               sleep( 10 );
  49.             } catch ( Exception e ) {}
  50.         }
  51.       }
  52.   } 
  53.   public static void main(String[] args){new DoubleBufferingSoftware();}
  54. }