Sistema Visualizador de Cómics en Internet  
 
     
Buscador:
Digital ToTSoL Web
 
powered by FreeFind

     Indice de apartados       

Ir a:  Descripción del proyecto

Ir a:  Características del visor

Ir a: Menú de opciones

Ir a: Desplazamiento Horizontal y Vertical

Ir a: Lectura en varios idiomas y ampliación de los globos

Ir a:  Características del software empaquetador

Ir a:  El porqué

Explicar la necesidad de un Sistema Visualizador de Cómics en Internet

 Notas sobre el proyecto

Revisión de las dificultades y soluciones en el desarrollo de animaciones gráficas en Java

Ir a:  !Incidencias!

Relación de problemas reconocidos y como convivir con ellos

Ir a:  Comics en el Visor

Lista de los comics que se pueden visualizar.

 

Notas sobre el proyecto

Revisión de los problemas y soluciones en el desarrollo de animaciones gráficas en Java

Para explicar la parte gráfica del Visor de Cómics en Internet no viene mal un poco de información.

Mi primer libro de Java fue Java Manual de Referencia de Naughton y Schilt ed Obsborne McGraw-hill (ISBN: 84-481-1131-1), sólo trata el java 1.0 y, aunque tiene un capítulo dedicado a los gráficos en java, sus lagunas son importantes, sobre todo en lo referente a cuando se realiza la carga de una imagen en memoria.

Así que, el lugar donde encontré una explicación clara de lo que hicieron los chicos de Java, fue en JavaWorld, en la serie de artículos How-To Java, son artículos de Todd Sunsetd dedicados a los gráficos:

Learn how applets load network-based images asynchronously (Here´s a close at the vay Java appltes handle images in a network-based environment) que contiene una explicación clara de cómo se desarrolla el proceso asíncrono de carga y representación de imágenes. O sea, de gran utilidad.

En un segundo artículo el How Java uses the producer /consumer model to handel imagens - An insider´s look, profundiza más, y explica el modelo productor / consumidor que está en la base de las clases gráficas del paquete awt, necesario por el retraso entre petición y respuesta que se produce en la red. Presenta las interfaces ImageProducer e ImageConsumer, y muestra un ejemplo de implementación, . De acuerdo, es recomendable haber trasteado ya con los paquetes gráficos de Java, antes de dejar las cejas en la lectura del artículo.

En un tercer artículo When static images just don´t make the cut, (learn how to spice up your applets and applications with animated images). Analiza con más detalle el interface ImageProducer, para realizar una animación.

Además, en todos estos artículos hay enlaces útiles que complementan la información.

A modo de resumen y para fijar un esquema: en el proceso de creación de una imagen intervienen ocultas las siguientes interfaces:

  • ImageProducer ( Crea la imagen o la recibe del exterior -disco, red- )
  • ImageConsumer ( Recibe las notificaciones del estado de la recuperación / creación de la imagen y almacena los datos de la imagen).
  • ImageObserver ( Oculta la complejidad del ImageConsumer).

Para ocultar más:
  • la clase Applet es heredera de la clase Component. Component implementa el interface ImageObserver, para que cuando se haya recibido la imagen se llame al método paint() (vía repaint()). Con lo cual sólo hay que desarrollar el método paint().
  • Por otro lado, tenemos que la clase Component tiene el método getImage() que oculta el ImageProducer en el caso de recuperar una imagen de un fichero GIF o JPG, y el método prepareImage() oculta el trasiego entre el productor y consumidor.
  • Lo mismo hacen el drawImage() de la clase Graphics y la clase MediaTracker.

Sigamos otro poco:
    Miremos hacia la clase java.awt.image.MemoryImageSource, que está pensada para la animación: implementa el ImageProducer para trabajar a partir de un array de enteros (buffer de memoria). Si generamos un objeto Image, con MemoryImageSource, toda la estructura de clases hará que cuando la imagen ya esté preparada automáticamente se llame método paint(). En este método será donde pasamos del buffer de memoria a la pantalla.

Verdaderamente, todo este esfuerzo de ocultación está bien y es productivo, pero desentrañarlo, tiene tela marinera, lo mostrado aquí es sólo el principio. A veces, se tiene la sensación de estar cazando moscas con un bazoca, cuando es del todo sabido que un simple matamoscas, es mas rápido, eficaz y ligero.

Pero, si esto no es suficiente y quieres saber qué pasa dentro del proceso de renderizado, es decir, cuando ejecutas el drawImage() en el segundo capítulo del libro Java 2D Graphics de Jonathan Knudsen, en la editorial O'Rell (ISBN: 1-56592-484-3), hay una excelente explicación.

    La división en 5 pasos del proceso:
  • transformación (determinar la forma que ha de ser randerizada)
  • ,
  • "rasterizer" (convertir un forma ideal en un conjunto de pixeles)
  • ,
  • seleccionar sólo el área que se ve afectada
  • ,
  • determina los colores usados
  • ,
  • y los combina con la imagen existente.

Además, el libro contiene un análisis de las librerías de Java 2D Graphics.

Con tanta teoría es necesario ver algún código fuente de un caso práctico: puedes visitar a Werner Randelshofer un chico suizo que tiene un par de productos dedicados a la animación, y con el código fuente a tu disposición. Además ha creado botones a lo swing compatibles con la versión de Java 1.0.2.. y utiliza el MemoryImageSource. En la dirección de guru gamelan contienen más ejemplos.

Una de las base principales en el diseño de un entorno gráfico de altos requerimientos de ejecución es el uso de los hilos (threads), y para su conocimiento completo tenemos el excelente libro Concurrent Programmning in Java (Design Principles and Patters) de Doug Lea en la editorial Sun y Addison-Wesley,(ISBN: 0-201-31009-0), que ya da una idea de su contenido, yo tengo el de la 2&#ordf; edición, es muy completo y relativamente fácil de seguir. Recomendable de todas, todas.

Pero si quieres soluciones más específicas para la representación gráfica de alto rendimiento, existe en la red la revista Dr Dopps Java una subparte de www.byte.com, De esta revista yo resaltaría:

Wrikting High-Perfomance Graphical Java Components(los de DJJ han retirado el ariculo), donde se explica un caso práctico de la creación de una clase gráfica y sus trucos para conseguir una animación aceptable cuando hay muchos cálculos y elementos gráficos. Sus consejos se pueden aplicar en otros campos.

Java 2 Graphis Rendering. ("An architecture for extreme animation). Su título despista, ya que no está dedicado en exclusiva a Java 2 Graphics, sinó que, es muy útil para saber que modelos de diseño (patterns) son útiles para un entorno gráfico de alto rendimiento. Es decir, a partir del modelo de diseño (patterns) en "pipeline" del proceso de representación gráfica, explica dos técnicas importantes: la pila de objetos (object pooling) y la cola de mensajes asíncronos para trabajar con un hilo, en cada una de las fases de renderizado.
Esto esta bien cuando hay que trabajar con pequeñas áreas de imagen, pero este no es mi caso y su rendimiento no era mejor que con un solo "thread" . (Yo también estoy sorprendido, pero mis tests así lo indican, se podría pensar que es un problema de asignación de prioridades a las hilos, pero no es asi, ya que donde se relentiza es en el momento de realizar la imagen, ya sea en memoria o en pantalla, y poco se puede hacer optimizando los hilos.)

Más sobre mensajes asíncronos: An Asynchronous Design Pattern. de Allan Vermeulen.

Subir


Digital ToTSoL Home | Negocios en Red | Desarrollos | Anotaciones Técnicas | Vinclateca
Copyright © (2000-2001) Ferrán Casasús Rodó Digital ToTSoL