Bonjour la zone,
voilà je bosse actuellement sur un programme de simulation de divison cellulaire en Java qui nous permettra peut-être de valider une théorie. Toute la partie algorithmique est terminée, maintenant je dois faire une jolie interface où on peut voir en temps réel les petites cellules se diviser.
Le soucis c’est que pour l’instant, j’ai un ArrayList avec mes objets Cell stockés avec toutes leurs propriétés et que ce dernier arrive rapidement au million d’objets. Pas de problème, Java le gère très bien jusqu’au moment ou je veux afficher tout ça en temps réel. Ne connaissant pas d’autres alternatives, j’ai créé un JPanel et à chaque division cellulaire, je parcours tout mon ArrayList et récupère les positions de chaque cellule et les affiche en simulant un point avec un g.drawLine(x,y,x,y).
On s’en doute, au bout d’un petit moment ça commence à ramer sévère. Devoir redessiner des millions de lignes plusieurs fois par seconde ça n’a pas l’air de lui plaire et je le comprend. Le truc c’est que je ne peux pas vraiment compter sur le fait de pouvoir éviter de redessiner deux fois la même chose, vu que le principe de la divison cellulaire c’est d’avoir 2 entités à partir d’une, il n’y a jamais la même chose à redessiner entre 2 repaint.
J’ai trouvé une solution temporaire qui est d’effectuer la simulation puis ensuite de dessiner le résultat. Ca marche mais c’est pas ce que je veux ! J’aimerais le voir en temps réel. Avez-vous des idées pour optimiser tout ça ? Java2D pourrait-il remplacer mon simple JPanel sur lequel je dessine ? Toutes idées sont les bienvenues !
Ca vaut ce que ca vaut, mais OpenGL (et ca peut fonctionner avec Java3D) gère des objets compilé, c’est à dire que c’est plus rapide à afficher et tu ne peux modifier l’objet par la suite. Donc tu pourrais compiler un objet qui ressemble à une cellule (quite à ce que ce soit des objet plats, en 2D), et en dessiner autant que tu voudrais, juste en changeant l’echelle à l’affichage. Il parait qu’avec cette technique on peut dessiner vraiment beaucoup de fois le meme objet (j’ai pas trop de chiffre à te donner, j’ai jamais été jusqu’au million).
[quote=“Nicjac, post:1, topic: 30254”]Bonjour la zone
Nicjac[/quote]
je vais peux etre dire une connerie mais a chaque division tu redéssines tout le tableau ou pas ?
Parce que un moyen semble serait d’optimiser l’affichage en gros tu dessine A puis tu rajoutes A’
sans redessiner A.
Tu evites de redessiner tout le tableau a chaque division. Tu memorises celles déja déssinés.
Y’a un moyen en java de faire ca, ou en gros tu rajoutes des points sur un affichage au fur et à mesure
plutot que de faire un “ecran” a chaque fois.
De ma petite experience Java2D (2 ans de taf la dessus, marre): le rendu est lent, tres lent. Les paths Opengl et Direct3D ne sont la que pour certaines routines tres particulieres, le reste reste lent au possible, surtout en polygon pleins. Regarde plutot directement dans Opengl. Il existe plusieurs mapping java/opengl, je te conseille jogl (https://jogl.dev.java.net/). Simple d’utilisation, simple d’implementation et resultat plus que satisfaisant niveau performance.
Sans y réfléchir, plutôt que de dessiner un point, tu peux peut être transformer ta matrice de points en image et afficher cette image à l’écran à chaque refresh…(je table sur le fait que l’api java pour faire une image est plus optimisée que ta méthode d’affichage).
Essayes aussi d’activer l’utilisation de l’OpenGL : http://java.sun.com/j2se/1.5.0/docs/guide/…w_features.html avec l’option -Dsun.java2d.opengl=True, ca permet d’aumenter à mort les performances de Java2D, il faut une carte graphique récente et une JVM 5.0.
Utilise plutot un JComponent à la place de ton JPanel