una puntos metodo graficos elipse dibujar java performance graphics java-2d

puntos - java 2d pdf



Rendimiento óptimo de dibujo 2D de Java (9)

Hay algunas cosas que debes tener en cuenta

1) es refrescante Este enlace muestra cómo usar los osciladores que podrían ser una buena opción para llamar a repintado. Obteniendo el repainting descifrado (como los carteles anteriores han dicho que es importante para que no estés haciendo demasiado trabajo).

2) Asegúrate de que solo estás dibujando en un hilo. La actualización de la interfaz de usuario de varios hilos puede llevar a cosas desagradables.

3) Doble almacenamiento en búfer. Esto hace que la representación sea más suave. este sitio tiene más información buena para ti

Estoy en el proceso de escribir un juego Java 2D. Estoy utilizando las bibliotecas de dibujo 2D integradas de Java, dibujando en un Graphics2D que obtengo de una BufferStrategy desde un Lienzo en un JFrame (que a veces es una selección completa). BufferStrategy tiene doble amortiguación. Repintar se hace de forma activa, a través de un temporizador. Sin embargo, estoy teniendo algunos problemas de rendimiento, especialmente en Linux.

Y Java2D tiene muchas formas de crear memorias intermedias gráficas y dibujar gráficos que simplemente no sé si estoy haciendo lo correcto. He estado experimentando con graphics2d.getDeviceConfiguration (). CreateCompatibleVolatileImage, que parece prometedor, pero no tengo una prueba real de que vaya a ser más rápido si cambio el código de dibujo a eso.

En su experiencia, ¿cuál es la forma más rápida de renderizar gráficos 2D en la pantalla en Java 1.5+? Tenga en cuenta que el juego está bastante adelantado, por lo que no quiero cambiar a un método de dibujo completamente diferente, como OpenGL o un motor de juego. Básicamente, quiero saber cómo obtener la forma más rápida de usar un objeto Graphics2D para dibujar cosas en la pantalla.


He hecho algunas aplicaciones básicas de dibujo usando Java. No he trabajado en nada demasiado intensivo en gráficos, pero recomendaría que tenga un buen manejo de todas las invocaciones de ''repintar''. Una llamada de repintado adicional en un contenedor principal podría duplicar la cantidad de renderizado.


asegúrese de usar doble buffering, dibuje primero en un gran búfer en la memoria que luego va a la pantalla cuando todo el dibujo está hecho.


Aquí hay algunos consejos en la cima de mi cabeza. Si fueras más específico y estuvieras tratando de hacer, quizás pueda ayudarte más. Suena como un juego, pero no quiero suponer.

¡Solo dibuja lo que necesites! No llame ciegamente a repintado () todo el tiempo, pruebe con algunos de los hermanos como volver a pintar (Rect) o volver a pintar (x, y, w, h).

Tenga mucho cuidado con la mezcla alfa ya que puede ser una operación costosa mezclar imágenes / primitivas.

Trate de prerender / caché tanto como sea posible. Si te encuentras dibujando un círculo de la misma manera, una y otra vez, considera dibujar en una Imagen Buffered y luego dibuja la Imagen Buffered. Estás sacrificando la memoria por la velocidad (típica de los juegos / gráficos de alto rendimiento)

Considere usar OpenGL, use JOGL de LWJGL. JOGL es más parecido a Java, mientras que LWJGL proporciona más funcionalidad de juego además de acceso OpenGL. OpenGL puede dibujar órdenes de magnitud (con hardware y controladores adecuados) que Swing.


Una alternativa si no quiere ir a Java 2D puro es usar una biblioteca de juegos como GTGE o JGame (buscarlos en Google), luego ofrecer un fácil acceso a los gráficos y también ofrecer doble buffering y comandos de dibujo mucho más simples.


Hay uno importante que aún no se ha mencionado, creo: imágenes en caché de todo lo que se puede. Si tiene un objeto que se mueve a través de la pantalla, y su apariencia no cambia mucho, dibuje en una imagen y luego visualice la imagen en la pantalla en una nueva posición en cada cuadro. Hazlo incluso si el objeto es muy simple: te sorprenderá cuánto tiempo ahorras. La representación de un mapa de bits es mucho más rápida que la representación de primitivas.

Es posible que también desee consultar la configuración explícita de sugerencias de renderizado y desactivar cosas como antialiasing si las consideraciones de calidad lo permiten.


He estado viendo esta pregunta, esperando que alguien te ofrezca una mejor respuesta que la mía.

Mientras tanto, encontré el siguiente documento de Sun que fue escrito después de una versión beta de jdk 1.4. Aquí hay algunas recomendaciones interesantes sobre el ajuste fino, incluidas las banderas de tiempo de ejecución (en la parte inferior del artículo):

" Indicador de tiempo de ejecución para Solaris y Linux

A partir de la versión Beta 3 del SDK, versión 1.4, Java 2D almacena imágenes en mapas de píxeles de forma predeterminada cuando DGA no está disponible, ya sea que esté trabajando en un entorno de visualización local o remota. Puede anular este comportamiento con el indicador pmoffscreen:

-Dsun.java2d.pmoffscreen = verdadero / falso

Si configura este indicador como verdadero, el soporte de mapa de píxeles fuera de pantalla se habilitará incluso si DGA está disponible. Si establece este indicador en falso, el soporte de mapa de píxeles fuera de pantalla se desactiva. Desactivar el soporte de mapa de píxeles fuera de pantalla puede resolver algunos problemas de renderizado. "


Estoy teniendo los mismos problemas que tú, creo. Mira mi publicación aquí:

Problemas de rendimiento de Java2D

Muestra el motivo de la degradación del rendimiento y cómo solucionarlo. Sin embargo, no está garantizado que funcione bien en todas las plataformas. Verás por qué en la publicación.


Una síntesis de las respuestas a esta publicación, las respuestas a Consty''s y mi propia investigación:

Que funciona:

  • Use GraphicsConfiguration.createCompatibleImage para crear imágenes compatibles con lo que está dibujando. Esto es absolutamente esencial!
  • Utilice el dibujo de doble búfer a través de Canvas.createBufferStrategy .
  • Use -Dsun.java2d.opengl=True donde esté disponible para acelerar el dibujo.
  • Evite usar transformaciones para escalar. En cambio, guarde versiones escaladas de las imágenes que va a usar.
  • ¡Evita las imágenes translúcidas! Las imágenes de máscara de bits son buenas, pero la translucidez es muy costosa en Java2D.

En mis pruebas, al usar estos métodos, obtuve un aumento de velocidad de 10x - 15x, lo que hace que los gráficos Java 2D adecuados sean una posibilidad.