Bonjour,
j'ai un programme d'automate cellulaire, que j'aimerais optimiser pour gagner en vitesse d’affiche. Le fonctionnement du programme se définit comme suivant :
1-Les cellules sont des carrés d'une matrice dont je définie le nombre.
2-Au démarrage chaque cellule peut prendre deux valeurs possibles(true =vivant, false =morte)
3-L'état de chaque cellule évolue à l'instant t1 en fonction du nombre de cellules qui l'entourent au temps t.
4-La matrice évolue ainsi de t(0)->t(n) avec n qui tend vers l'infinie.
5-Ainsi à l’instant t(n) par exemple, je fige la matrice, je relève les valeurs pour calculer le nouvel état à t(n+1).
Le programme contient deux boucles de calculs principales.
-la première est celle qui calcule la valeur que prendra chaque cellule à l'instant suivante.
-la seconde est celle qui utilise GDI+ (graphics.FillRectangle) pour tracer la couleur de chaque cellule en fonction de la valeur calculée.
L'affichage est fluide lorsque que j'ai 100*100 par exemple, 10 000 cellules à traiter une par une ça passe.
quand je passe à 1000*1000, =>1 million de cellules à traiter, l’affichage devient très lente et pourtant j'ai une charge de processeur qui ne dépasse jamais 25% au total et jamais 50% par coeur. Le programme passe la majorité de son temps dans la boucle d'affichage.
j'ai cherché pas mal de solution sur le net et après plusieurs tests, j'ai gardé openMP qui s'avère de très loin le plus efficace comparé à parrallel_for de la <ppl> et parrallel_for_fixed.
j'ai ainsi optimisé la première boucle de calcul qui divise la boucle sur 4 threads, ça n'a pas apporté grand chose pratiquement rien car le gros du temps est passé dans la boucle d'affichage. J'ai trouvé aucune solution pour partager le travail entre les 4 coeurs. GDI+ ne supportant pas les threads apparemment.
Quelqu’un pourrait m'aider pour augmenter la fluidité svp ?
code coeur de la boucle d'affichage
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 for(int colonne=0;colonne<m_nTaille;colonne++)//pour chaque colone de la ligne choisie { if ( m_Cellules[ligne*m_nTaille+colonne] == true) { g.FillRectangle(&CaseVivante, ZonesCellule); //couleur "CaseVivante" pour la cellule vivante } else { g.FillRectangle(&CaseMorte, ZonesCellule);//couleur "CaseMorte" pour la cellule morte } }
Partager