2011-05-17 7 views
3

On m'a confié la tâche d'améliorer les performances d'un logiciel de cartographie boursière utilisant les codes GC de SWT pour dessiner les graphiques. Le dessin de diagramme doit être amélioré car les diagrammes sont parfois redessinés plusieurs fois par seconde et consomment beaucoup de temps processeur. Après avoir cherché un peu, j'ai trouvé un blog entry qui suggère la modification directe des objets ImageData au lieu d'utiliser les méthodes de GC, promettant de grands gains de performance. C'est une tâche facile de tracer des lignes droites et des formes carrées horizontales et verticales en utilisant cette technique, mais quand il s'agit de dessiner des cercles et d'autres formes irrégulières, il n'y a pas de solution facile.Comment améliorer les performances de dessin SWT?

Est-ce que quelqu'un sait s'il y a une bibliothèque pour dessiner des formes sur ImageData objets, comme les méthodes de GC faire sur Image objets?

De même, est-ce que quelqu'un connaît une autre façon d'améliorer les performances SWT?

Merci d'avance.

+0

http://pub.cosylab.com/CSS/DOC-SWT_Vs._Swing_Performance_Comparison.pdf Je suis tombé sur ceci pour une autre question, pourrait être utile. – dfb

Répondre

4

Au lieu d'améliorer les performances des routines de dessin, je me concentrerais sur la logique de dessin. Peut-être que vous pouvez simplement redessiner la différence entre l'ancien et le nouveau graphique? Cela dépend bien sûr en grande partie de l'apparence des graphiques et des données qu'ils présentent.

Essayez de réduire les opérations de dessin. N'essayez pas de les rendre plus rapides.

+1

Exemple: Rendre l'arrière-plan (échelles, étiquettes, grille) à une image et l'utiliser pour configurer votre zone de rendu. Ensuite, il suffit de dessiner le graphique lui-même au-dessus de cela. –

2

Cela peut sembler un grand pas (et il est), mais la meilleure approche pour améliorer les performances de dessin SWT pour moi était de passer au rendu OpenGL. Je n'implique pas que vous devriez dessiner votre interface utilisateur entière avec elle, mais la partie des graphiques.

Il existe de nombreuses approches pour le faire. Mon choix était d'utiliser le JOGL library. L'inconvénient de cette approche est que vous devez apprendre et utiliser une nouvelle API qui est très différente de ce que l'on sait de java. D'un autre côté, au fur et à mesure que vos scènes deviennent plus complexes, les gains d'externalisation du rendu sur le GPU augmentent. J'ai expérimenté des gains FPS entre 2x et 10x.

Une autre bonne chose est que vous n'avez pas besoin de faire un plongeon profond dans OpenGL, il existe de grandes bibliothèques comme jMonkeyEngine, cachant une grande partie de la complexité sous-jacente.

5

Mesurez les performances de votre solution. Où passe le plus de temps? Deviner n'est pas suffisant. Dans 90% des cas, vos suppositions seront fausses. Si vous ne le savez pas, vous ne pouvez pas résoudre le problème.

SWT lui-même n'est pas lent. En fait, SWT est juste une couche très mince sur les appels de système OS respectifs à dessiner.

Un des problèmes de SWT est qu'il est synchronisé. Pour vous assurer que les problèmes de thread ne causent aucun problème, il existe un verrou global. Donc, si vous effectuez un rendu à partir de plusieurs threads à la fois, cela peut poser problème. Ou peut-être que vous ne cachez pas correctement les ressources comme les couleurs et les polices. Ceux-ci sont chers à créer. Combien de GC créez-vous? En gardez-vous une ou en créez-vous une nouvelle par image?

Mais je ne fais que deviner ici. À moins que vous ne puissiez prouver avec un moniteur de performance «le plus de temps est consacré à ...», il n'y a aucun moyen de vous aider.

Questions connexes