Uso del double-buffering hardware
Artículo por Club Developers · 31 May 2006
2770 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 ); } } } }


