[.NET] Perfs pourries avec Graphics

Perfs pourries avec Graphics [.NET] - C#/.NET managed - Programmation

Marsh Posté le 25-07-2006 à 16:39:57    

Code :
  1. private void colorTimer_Tick(object sender, EventArgs e)
  2.         {
  3.             brush.Color = Color.FromArgb(rnd.Next(255), rnd.Next(255), rnd.Next(255));
  4.             Graphics g = this.CreateGraphics();
  5.             g.FillRectangle(brush, rnd.Next(sizeX) * 10, rnd.Next(sizeY) * 10, 10, 10);
  6.         }


 
Ca se traîne un max ce bout de code...
 
Je l'ai mis en un timer qui se lance toutes les ms et... Il doit tourner à tout casser 20 fois par secondes, si c'est pas moins...
Comment améliorer les perfs ?
 
PS: le CreateGrahics() n'impacte pas les perfs. J'ai tenté de travailler dans un objet global, mais ça change rien aux perfs, par contre ça fout à plat la mémoire en 5 minutes.

Reply

Marsh Posté le 25-07-2006 à 16:39:57   

Reply

Marsh Posté le 25-07-2006 à 17:15:02    

Pour la mémoire mise à plat toutes les 5 minutes, pourquoi ne forces-tu pas le garbage collector (System.GC.Collect()) à chaque tick ?

Reply

Marsh Posté le 25-07-2006 à 17:21:36    

ze souci (bon, ok, j'ai pas vérifié dans ce cas précis), c'est que quand on dessine quelquechose dans un objet Graphics (dans mon cas d'hier soir, un objet Image), il le conserve en mémoire.
 
on s'en rends très bien compte quand on dessine une image de 1600 x 1200 dans un petit rectangle de 160x120.
 
=> A l'écran, ben on a l'image tout dégradée.
=> Si on lance l'impression de l'objet Graphics, il a conservé l'image originale, et du coup, on peut imprimer en 1400dpi sans problème, on a une qualité parfaite.
 
Je suppose que c'est pareil avec les rectangles (y'a pas de raison).
 
Mais de toute façon, j'ai testé, et c'est pas le fait de recréer cet objet à chaque occurence qui ralenti tout. Avec ou sans, je n'ai pas noté la moindre différence.
 
Je soupçone qu'il fasse un paint à chaque occurence déjà, et qui porte peut-être sur toute la fenêtre... Mais je ne sais même pas comment vérifier... Et encore moins corriger :sweat:


Message édité par Arjuna le 25-07-2006 à 17:21:48
Reply

Marsh Posté le 27-07-2006 à 10:09:46    

Si tu veux vérifier le nb de millisecondes prises par ton code, tu peux afficher l'heure à la milliseconde près avec DateTime.Now.
Tu verras combien de temps il faut pour faire ce dessin.
 
Perso, je pense que ce qui te bouffe de la mémoire, ce n'est pas le FillRectangle, mais ton object Graphics que tu ne DETRUIT PAS !!
Essaye donc d'encastrer donc ton Graphics gc = this.CreateGraphics() dans un bloc using...

Reply

Marsh Posté le 27-07-2006 à 10:13:51    

connais pas cette clause :) vait regarder

Reply

Marsh Posté le 27-07-2006 à 10:35:05    

c'est rigolo comme instruction.
 
cependant, je ne pige pas un truc...
 
normalement, quand on crée un objet dans un bloc { }, quelle que soit la clause précédent le bloc (function, if, try, etc.) la portée de l'objet, c'est uniquement le bloc non ?
 
alors à quoi sert réellement le using ?
le fait de faire créer l'objet par un objet partagé fait que l'objet reste en mémoire, même si le dernier handle qui pointe dessus est détruit :??:

Reply

Marsh Posté le 27-07-2006 à 10:48:05    

Arjuna a écrit :

c'est rigolo comme instruction.

Ah bon ? :)

Arjuna a écrit :

cependant, je ne pige pas un truc...
 
normalement, quand on crée un objet dans un bloc { }, quelle que soit la clause précédent le bloc (function, if, try, etc.) la portée de l'objet, c'est uniquement le bloc non ?
 
alors à quoi sert réellement le using ?
le fait de faire créer l'objet par un objet partagé fait que l'objet reste en mémoire, même si le dernier handle qui pointe dessus est détruit :??:

OUI, la portée de l'objet c'est uniquement le bloc, DANS UN ENVIRONNEMENT DE DEVELOPPEMENT BIEN CONCU.
Mais là on est sous Windows.
 
Certains objets sont un peu... persistant. Exemples : Pen, Brush et Graphics.
Ceux-là il faut les détruire sinon ils restent en mémoire, dans un coin sombre et connu d'eux seuls, avec pour seul objectif de faire péter ton application. Très fourbe le Graphics.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed