viernes, 4 de abril de 2014

Técnica del doble buffer

La técnica del doble buffer proporciona la mejor solución para el problema de las animaciones, aunque requiere una programación algo más complicada. La idea básica del doble buffer es realizar los dibujos en una imagen invisible, distinta de la que se está viendo en la pantalla, y hacerla visible cuando se ha terminado de dibujar, de fonna que aparezca instantáneamente. 
Para crear el segundo buffer o imagen invisible hay que crear un objeto de la clase Image del mismo tamaño que la imagen que se está viendo y crear un contexto gráfico u objeto de la clase Graphics que permita dibujar sobre la imagen invisible. Esto se hace con las sentencias. Image imglnv; Graphics graphlnv; Dimensión dimlnv; Dimensión d = size(); // se obtiene la dimensión del panel en la clase que controle el dibujo (por ejemplo en una clase que derive de Panel). 
El siguiente paso es re-definir el método updateQ de fonna que no borre la imagen anterior con el color de fondo. Deberá llamar directamente al método paintQ: public void update (Graphics g) { paint(g); // Sin borrar la imagen anterior se llama al método paint() } // fin del método update() En el método paintQ se modifica el código de modo que primero se dibuje en la imagen invisible y luego ésta se haga visible:

public void paint (Graphics g) {
// se comprueba si existe el objeto invisible y si sus dimensiones son correctas
if ((graphlnv==null) II (d.width!=dimlnv.width) II (d.height!=dimlnv.height)) {
dimlnv = d;
// se llama al método createImage de la clase Component
imglnv = createlmage(d.width, d.height);
// se llama al método getGraphics de la clase Image
graphlnv = imglnv.getGraphics();
}
// se establecen las propiedades del contexto gráfico invisible,
// y se dibuja sobre él
graphlnv.setColor(Color.white); // Se borra pintando de blanco
graphlnv.fillRect(0, 0, dimlnv.width, dimlnv.height) ;
graphlnv.setColor(Color.white); // Se asigna un color para dibujar
// Sentencias para dibujar sobre graphlnv
graphlnv.drawLine(0, 0, 100, 100);
// finalmente se hace visible la imagen invisible a partir del punto (0, 0)
//         utilizando el propio panel como ImageObserver
g.drawImage(imglnv, 0, 0, this);
} // fin del método paint()
Los gráficos y las animaciones son particularmente útiles en las applets. El Tutoríal de Sun tiene un ejemplo (un applet) completamente explicado y desarrollado sobre las animaciones y los distintos métodos de eliminar el flicker o paipadeo.

No hay comentarios:

Publicar un comentario