Bonjour à toute la communauté.
Je me permet de vous soumettre un problème que j'ai avec mon petit logiciel de dessin vectoriel. Je vais tenter d'être à la fois bref et précis.
Je suis développeur amateur et je travaille depuis quelques mois sur un petit logiciel de dessin vectoriel dont je suis assez fier puisqu'il permet déjà de créer, modifier, manipuler, copier/coller, colorer des polygones/generalPath, à l'unité ou en groupe (via une arborescence de "noeuds de scenes" classique "groupes/sous-groupes" et "polygones/generalPath" représentée par un JTree). Il permet d'enregistrer et ouvrir les dessins ainsi obtenus dans un format que j'ai crée proche du SVG (simplifié). Enfin bref pas mal de boulot pour un amateur, d'autant que je n'utilise pas de librairies externes (style "batik").
Mon gros problème c'est que les animations qui s'effectuent lorsqu'on manipule un ou plusieurs polygones dans un graphisme de plusieurs polygones sont tres tres lentes. Pour m'en convaincre, j'ai créer differents "dessins" comprenant de plusieurs dizaines à plusieurs milliers de polygones, et je tombe à 5 FPS quand j'affiche 6800 polygones.
Je suis sous Swing et mes graphismes s'affichent dans un JPanel. Le processus qui s'effectue est des plus simple, c'est celui que l'on trouve dans la plupart des exemples sur le web: les evenements de souris (MouseEvent) engendrent des calculs sur les polygones (position, rotation, redimension) puis enchainent sur un repaint() du JPanel. La méthode paintComponent de ce JPanel appelle les méthodes "Dessiner" de mon SceneManager et de mon DebugSceneManager, qui contiennent respectivement les polygones/groupes et méthodes affiliées pour l'un, une liste des polygone selectionnés pour l'autre. Pour info, le DebugSceneManager sert à mettre en évidence, par dessus la "scene", les polygone selectionnés, ceux sur lesquels on agit.
Clairement, et peut-être sont-ce là mes erreurs, je n'utilise pas de Thread séparé, pas de BufferStrategy, pas de BufferedImage... Le "repaint" du JPanel est effectivement une opération "lourde" dans la mesure où le SceneManager redessine toute l'arborescence de la scene, polygone apres polygone...
J'ai essayé de nombreuses astuces, optimisé au mieux mon code, pourtant les repaint() qui s'effectuent "en rafale" en réaction aux mouvement de souris, sont lent, en particulier dans un gros "dessin".
Alors j'aimerais beaucoup, si l'un de vous se sent le coeur de m'éclairer, qu'on m'explique quelle est la meilleure technique pour afficher et animer un nombre conséquent de polygones dans Swing? Est-ce simplement possible? Est-ce qu'il y a une astuce??? Je n'ai JAMAIS autant galéré, fait d'essais... Et étant donné le temps que je perd à chaque fois... Si on pouvais m'aider ce serait super!!!
Merci d'avance à ceux qui prendront le temps de me lire.
Christophe.
PS: Deux images de mon prog:
Pour illustrer l'affichage du "DebugSceneManager" (ce sont les polygones selectionnés et affichés en bleu)
![]()
Partager