2012-05-08 3 views
7

Je pense que la performance de dessin de JavaFX 2 est pire que celle de Swing. Je pense que l'une des raisons est la façon dont vous dessinez des choses, par ex. Lorsque vous dessinez une Ligne, vous devez créer un objet Line pour chaque ligne et l'ajouter à un conteneur tandis que dans Swing on obtient simplement Graphics2D une fois, puis DrawLine sans créer un nouvel objet à chaque fois. Donc, y a-t-il une manière plus performante de dessiner en utilisant JavaFX 2, par ex. si vous devez dessiner environ 3000 Arcs? Quelle est la meilleure "surface de dessin"? Actuellement, j'utilise un Group. Merci pour tout indice!Performance de dessin de JavaFX 2

Répondre

14

Votre approche actuelle de l'utilisation d'un groupe est susceptible de bien, et vous trouverez probablement que la performance de dessin 3000 arcs au sein de votre groupe est parfaitement acceptable pour les utilisateurs de votre application. Une alternative actuelle à l'utilisation d'un groupe serait d'utiliser des volets de mise en page qui ajouteraient une fonctionnalité pratique, mais ajouteraient une couche supplémentaire de surcharge, ce qui est inutile lorsque vous avez des milliers d'objets facilement disposés manuellement. Voir le JavaFX mailing list archive pour une discussion sur une prochaine interface de dessin direct (appelée le Canvas Node) pour JavaFX 2.2 et ses implications.

Bien qu'il puisse sembler moins performant de coller des objets dans un conteneur, l'implémentation de conteneur peut, si elle le souhaite, utiliser un matériel de rendu de mode retenu accéléré intégré dans un gpus moderne. Notez également que l'architecture JavaFX conserve en interne la trace des zones encrées et met en cache les résultats des opérations de rendu coûteuses afin d'augmenter les performances. Par conséquent, l'utilisation d'un conteneur n'implique pas, en soi, des performances plus lentes qu'une interface de dessin direct qui pourrait dépendre d'une implémentation en mode immédiat.

Le choix d'une surface de dessin dépend de l'application. La meilleure surface pour la plupart des applications JavaFX sera une collection de noeuds scenegraph plutôt qu'un noeud canvas. L'utilisation de plusieurs nœuds dans un SceneGraph plutôt que dans un seul Canvas sera (en général) plus facile à développer et la performance sera parfaitement acceptable. Finalement, il est probable que de nombreux articles de blog seront écrits pour comparer les performances de Canvas avec de nombreux objets de scène et peut-être avec d'autres frameworks tels que html canvas, java2d, swing, etc. Ainsi, avec le temps, il sera plus facile de répondre à une telle question.

connexes

Osvaldo de JavaFX performance analysis, bien que vieux, comprend également une discussion en profondeur de quelques-unes des questions soulevées dans votre question. Il y a une belle section sur Performance Tips and Tricks dans le openjfx wiki.

Il y a des questions liées à la performance StackOverflow JavaFX:

+0

Merci beaucoup pour cette information détaillée! –

2

Dans JavaFX 2.2 un objet similaire à HTML5 Canvas est prévu d'ajouter que vous conviendra idéalement besoin de dessiner beaucoup de primitevs.

Voir documents liés à la prochaine question pour plus de détails: http://javafx-jira.kenai.com/browse/RT-17407

+0

Merci pour le lien, je suis curieux de savoir comment il va performer, quand il est sorti :-) –

1

LOOK le poste d'expérience Pixel Graphics pour le indice. Il y a 2 approches où dans le premier Group est utilisé et ImageView dans un autre. Bien que ne l'ai pas essayé moi-même l'auteur dit que l'approche ImageView est plus rapide et a une meilleure visualisation. D'un autre côté, il utilise une méthode API obsolète.