Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1047 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [.NET] Perfs pourries avec Graphics

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[.NET] Perfs pourries avec Graphics

n°1413219
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-07-2006 à 16:39:57  profilanswer
 

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.

mood
Publicité
Posté le 25-07-2006 à 16:39:57  profilanswer
 

n°1413270
Benwoua
XVI
Posté le 25-07-2006 à 17:15:02  profilanswer
 

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

n°1413277
Arjuna
Aircraft Ident.: F-MBSD
Posté le 25-07-2006 à 17:21:36  profilanswer
 

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
n°1414302
_Mose_
Lonesome coder
Posté le 27-07-2006 à 10:09:46  profilanswer
 

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

n°1414303
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 10:13:51  profilanswer
 

connais pas cette clause :) vait regarder

n°1414320
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 10:35:05  profilanswer
 

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 :??:

n°1414329
_Mose_
Lonesome coder
Posté le 27-07-2006 à 10:48:05  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [.NET] Perfs pourries avec Graphics

 

Sujets relatifs
[.NET] Objet Graphics, DrawImage et occupation mémoire[.NET/C#] Data Format String, Besoin d'un coup de pouce
[ASP.NET] [Résolu] Limiter la taille de la textbox d'un boundfield[VB.NET et C#.Net] Problème de tableau /click bouton (postback?)
[.NET] DataTable ou DataAdapter et update/insert -goto en C# oo-[C#.NET] Capture d'ecran d'une balise div
[ASP.NET] Cherche objet BDDComment ajouter une ligne entête a une pièce jointe en .NET 2.0?
[VB .NET] Passage de variables dans une form 
Plus de sujets relatifs à : [.NET] Perfs pourries avec Graphics


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR