PIZiadas gráficas

PIZiadas gráficas

Mi mundo es la imagen.

Programación gráfica: Doblebuffering : Dibujar en segundo plano [JAVA]

doblebufferAl crear el motor de animación hemos visto que al refrescar la pantalla se produce un parpadeo indeseable. Este efecto es consecuencia del tiempo que se necesita para borrar la imagen y generar la nueva actualizada, resultado de animar los objetos.

Una técnica para evitar esto es la denominada doble buffer o “doublebuffered, de forma que utilizamos dos imágenes (memorias gráficas) al mismo tiempo. Mientras se dibuja en una, vemos la otra y minimizamos el tiempo de cambio entre las imágenes eliminando el parpadeo.

En informática, el almacenamiento en búfer múltiples es el uso de más de un buffer para mantener un bloque de datos, de modo que un “lector” verá una completa versión de los datos, en lugar de una versión parcialmente actualizada de la datos que se crean por un “escritor”. También se utiliza para evitar la necesidad de usar la memoria RAM de doble puerto, cuando los lectores y escritores son dispositivos diferentes.(W)

Modificaremos la clase “Blackboard” que hemos modificado para incorporar el motor de animación para implementar esta técnica. Necesitaremos conocer las dimensiones de la pantalla gráfica para almacenar la suficiente memoria, y definiremos un objeto “Image” que será sobre el que dibujaremos los gráficos.

	Dimension d;
	private Image mImage = null;

El método “paint” de dibujo obtendrá primero el tamaño de la imagen a generar. La llamada a la función “checkOffScreenImage()” se encargará de asegurarnos un objeto “mImage” sobre el que dibujar.

Para dibujar en este objeto solicitaremos su dirección gráfica con la función “getGraphics“. A continuación lo rellenaremos del color que usemos para el fondo dibujando sobre este elemento un rectángulo relleno.

Llamaremos a las rutinas de dibujado de la imagen, que hemos implementado en la función “paintOffScreen” pasándole este objeto gráfico como parámetro para que lo use como lienzo.

La última función dibujará en pantalla el lienzo o imagen generado.

	public synchronized void paint(Graphics g) {
	   d = getSize();
	   checkOffScreenImage();
	   Graphics offG = mImage.getGraphics();
	   offG.setColor(getBackground());
	   offG.fillRect(0, 0, d.width, d.height);
	   paintOffScreen(mImage.getGraphics());
	   g.drawImage(mImage, 0, 0, null);
	}

La función “checkOffScreenImage()” se encargará de supervisar si ha cambiado el tamaño de la ventana utilizada para mostrar la información gráfica y generar un objeto sobre el que dibujar, mediante la función “createImage()

	private void checkOffScreenImage() {
	   Dimension d = getSize();

	   if (d.width == 0 || d.height == 0) {
		return;
	   }
	   if (mImage == null || mImage.getWidth(null) != d.width
	      || mImage.getHeight(null) != d.height) {
		mImage = createImage(d.width, d.height);
	   }
	}

La función “paintOffScree” es la antigua función o método “paint” que dibuja nuestros objetos gráficos, por lo que no merece comentarios adicionales. Simplemente hemos cambiado su nombre.

	public void paintOffScreen(Graphics g){
	   Enumeration enum=bd.elements();
	   Object ob;
	   while(enum.hasMoreElements()){
		ob=enum.nextElement();
		if(ob instanceof SimpleDrawable){
			((SimpleDrawable) ob).paint(g);
		}
	   }
	}

Al ejecutar la aplicación veremos que el parpadeo de la imagen ha desaparecido.

JAVA

Curso JAVA

Related Posts

  • Programación gráfica: Interacción : Eventos de ratón [JAVA]Programación gráfica: Interacción : Eventos de ratón [JAVA] Después de crear el entorno gráfico básico y el motor de animación, introduciremos las primeras nociones de interacción por medio de la incorporación del modelo de eventos del ratón. La técnica consistirá en generar un evento o suceso cada vez que se interactua con el ratón. Este […]
  • Fractales recursivos: Curva de Koch [JAVA]Fractales recursivos: Curva de Koch [JAVA] Hemos visto un primer programa denominado "DrawWorld" que nos introducía la programación en JAVA orientada a los gráficos. Este módulo de programación nos ha servido para ver un primer fractal recursivo: El triángulo de Sierpisnki. Veamos como modificar este programa elemental para […]
  • Fractales recursivos: Triángulo de Sierpinski [JAVA]Fractales recursivos: Triángulo de Sierpinski [JAVA] Hemos visto un primer programa denominado "DrawWorld" que nos introducía la programación en JAVA orientada a los gráficos. Veamos como modificar este programa elemental para generar un fractal recursivo básico: El triángulo de Sierpinski. (Ver como se genera un fractal recursivo) Es un […]
  • Programación gráfica: Motor gráfico de animación [JAVA]Programación gráfica: Motor gráfico de animación [JAVA] Después de definir un primer interface para dibujar los objetos gráficos en JAVA, vamos a implementar un motor gráfico de animación que nos permita gestionar la dinámica de la aplicación y, posteriormente, añadir interacción con el usuario. El motor se encargará de llamar a las […]
  • Programación gráfica: Objetos e interfaces orientados a gráficos [JAVA]Programación gráfica: Objetos e interfaces orientados a gráficos [JAVA] El siguiente paso en el tutorial de programación gráfica es definir un interface que será una clase JAVA que permita definir la acción de dibujar los gráficos y asignársela a los objetos, de forma que la clase encargada de pintarlos los reconozca adecuadamente.
  • Programación gráfica: Iniciar la construcción de la librería gráfica [JAVA]Programación gráfica: Iniciar la construcción de la librería gráfica [JAVA] Tras instalar el entorno de desarrollo (IDE) de Eclipse y crear un nuevo proyecto, hemos añadido un programa al proyecto Eclipse. El siguiente paso es empezar a estructurar la aplicación iniciando la construcción de los elementos de la biblioteca gráfica.