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 : 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);
    }
}
Et en multi-threads:

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
    }
}
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).