Bonjour à vous,
J'ai récemment créé un petit moteur de rendu de scène 3D. De base, il n'utilisait pas de threads supplémentaires.
Le traitement (la génération de l'image) prend ~2.5s. Je me suis donc dit que je pourrais essayer d'accélérer un peu tout ça en multi-threads (sur un core i7 920 d0 (4 cores physiques, 4 logiques)).
Le résultat: le programme met ~4.3s à l'exécution, mon implentation de threads l'a beaucoup ralentie. Je ne comprends pas bien pourquoi.
L'algorithme sans ajout de threads:
Et en multi-threads:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 for (int i = 0; i < hauteurImage; i++) { for (int j = 0; j < largeurImage; j++) { //calcul de la couleur du pixel //traitement de la couleur du pixel (pour le out of gamma) //affichage du pixel fenetre.getGraphics.setColor(couleurCalculee); fenetre.getGraphics.fillRect(ligne, colonne, 1, 1); } }
J'ai aussi essayé en créant un thread temporaire par calcul de pixel, mais les résultats sont les mêmes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //déclaration de x threads, où x = Runtime.getRuntime().availableProcessors(); for (int i = 0; i < hauteurImage; i++) { for (int j = 0; j < largeurImage; j++) { Thread truc = listeThreads.get(j%x); //thread correspondant au pixel en cours truc.join(); //attendre le traitement précédent du thread truc.start(); //calcul du pixel puis affichage de celui-ci, de la même méthode qu'en simple thread } }
Au final, les threads calculent un thread sur x, où x est le nombre de coeurs disponibles (ici 8, testé avec 4 aussi, mêmes résultats).
Partager