2012-05-08 14 views
7

Creo que el rendimiento de dibujo de JavaFX 2 es peor que el de Swing. Creo que una de las razones es cómo dibujar cosas, p. Al dibujar una línea, uno tiene que crear un objeto Line para cada línea y agregarlo a algún contenedor, mientras que en Swing uno solo obtiene Graphics2D una vez y luego drawLine sin crear un nuevo objeto cada vez. Entonces, ¿hay alguna forma más efectiva de dibujar usando JavaFX 2, p. si tiene que dibujar alrededor de 3000 arcos? ¿Cuál es la mejor "superficie de dibujo"? Actualmente estoy usando un Group. Gracias por cualquier pista!Rendimiento de dibujo de JavaFX 2

Respuesta

14

Su enfoque actual de utilizar un grupo, es probable, y probablemente encontrará que el rendimiento de dibujar 3000 arcos dentro de su grupo es perfectamente aceptable para los usuarios de su aplicación.

Una alternativa actual al uso de un grupo sería utilizar paneles de diseño que agregarían algunas funciones convenientes, pero agregaría una capa adicional de sobrecarga, que es innecesaria cuando tiene miles de objetos distribuidos fácilmente manualmente.

Consulte la JavaFX mailing list archive para ver una discusión sobre una próxima interfaz de dibujo directo (llamada Canvas Node) para JavaFX 2.2 y sus implicaciones.

Aunque puede parecer menos eficaz pegar objetos en un contenedor, la implementación del contenedor puede, si lo desea, hacer uso de hardware acelerado de renderizado incorporado en gpus moderno. También tenga en cuenta que la arquitectura JavaFX realiza un seguimiento interno de las áreas sucias y almacena en caché los resultados de las costosas operaciones de renderizado para aumentar el rendimiento. Por lo tanto, el uso de un contenedor no implica, por sí mismo, un rendimiento más lento que una interfaz de extracción directa que podría depender de una implementación de modo inmediato.

Elegir una superficie de dibujo dependerá de la aplicación. La mejor superficie para la mayoría de las aplicaciones JavaFX será una colección de nodos scenegraph en lugar de un nodo canvas. Usar muchos nodos en un scenegraph en lugar de un solo nodo Canvas será (generalmente) más fácil de desarrollar y el rendimiento será perfectamente aceptable.

Eventualmente, es probable que se escriban numerosos artículos de blog para comparar el rendimiento de Canvas frente a muchos objetos scenegraph y tal vez contra otros frameworks como html canvas, java2d, swing, etc. Así que con el tiempo, será más fácil responde esa pregunta

relacionada

de Osvaldo JavaFX performance analysis, aunque viejo, también incluye una discusión en profundidad de algunos de los problemas planteados en su pregunta.

Hay una buena sección en Performance Tips and Tricks en el openjfx wiki.

Hay algunas preguntas de desempeño Stackoverflow JavaFX relacionados:

+0

¡Muchas gracias por la información detallada! –

2

En JavaFX 2.2 un objeto similar a HTML5 Canvas está previsto para ser añadido que lo ideal es satisfacer la necesidad de dibujando muchos primitevs.

Ver documentos adjuntos al próximo número de detalles: http://javafx-jira.kenai.com/browse/RT-17407

+0

Gracias por el enlace, tengo curiosidad por lo bien que funcionará, cuando se lance :-) –

1

se ve el mensaje Pixel Graphics experimento para la pista. Hay 2 enfoques donde en 1er se usa Group y ImageView en otro. Aunque no lo intenté yo mismo, el autor dice que el enfoque ImageView es más rápido y tiene una mejor visualización. Por otro lado, usa el método API obsoleto.