Uso del double-buffering hardware
Artículo por Club Developers · 31 mayo 2006
2231 vistas
Los programadores de Sun se dieron cuenta cuenta que el [iurl=90&all=0&fs=978#988]double-buffering software[/iurl] a veces se quedaba corto, sobretodo en aplicaciones gráficas pesadas y juegos. Por tanto, decidieron implementar el uso de la tarjeta gráfica para reducir el número de cálculos. El Page-flipping o double-buffering hardware es el hecho de usar un indicador vÃdeo para decidir que buffer sirve de memoria y cual para mostrado.
Principio: creamos un buffer que sirvirá de buffer de memoria, después crearemos otro que servirá de buffer gráfico. Dibujaremos sobre el buffer de memoria las imágenes, los textos,.. mientras que el buffer gráfico muestra lo que contiene. Después invertimos los buffers, es decir, el buffer memoria pasa a ser gráfico y viceversa. Normalmente se les llama BackBuffer para el buffer memoria y FrontBuffer para el gráfico.
Veamos un ejemplo:
Principio: creamos un buffer que sirvirá de buffer de memoria, después crearemos otro que servirá de buffer gráfico. Dibujaremos sobre el buffer de memoria las imágenes, los textos,.. mientras que el buffer gráfico muestra lo que contiene. Después invertimos los buffers, es decir, el buffer memoria pasa a ser gráfico y viceversa. Normalmente se les llama BackBuffer para el buffer memoria y FrontBuffer para el gráfico.
Veamos un ejemplo:
java
 // bucle de mostrado  RenderingThread renderingThread = new RenderingThread();  // variable que permite usar la memoria VRAM  BufferStrategy strategy;  // buffer memoria donde se dibuja y escribe  Graphics buffer;  int x = 0; // coordenada x del mostrado del texto  public DoubleBufferingHardware(){    setSize( 400, 400 );    setVisible( true );    // inhibe el método normal de mostrado del componente    setIgnoreRepaint( true );    // creamos 2 buffers en la VRAM    createBufferStrategy( 2 );    // recuperamos los buffers gráficos de la memoria VRAM    strategy = getBufferStrategy();    buffer = strategy.getDrawGraphics();    renderingThread.start();  }  public void graphicalRender(){    buffer.fillRect( 0, 0, 400, 400 );    buffer.drawString( "mostramos una lÃnea de texto", x, 200 );    x++;    if ( x > 400 ) x = 0;    // enviamos todos los datos del buffer de memoria al de mostrado    strategy.show();  }   /**    * Este thread llama al repintado de la ventana cada 10 milisegundos    */    public void run(){     while( true ){       try {         // llamamos a nuestra propio método de refresco        graphicalRender();        sleep( 5 );     }    }  } }