Construction d'une image pixel par pixel en multi-threads
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:
Code:
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);
}
} |
Et en multi-threads:
Code:
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
}
} |
J'ai aussi essayé en créant un thread temporaire par calcul de pixel, mais les résultats sont les mêmes.
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).