Problème mémoire avec fonction zoom

Résolu
rbidocho Messages postés 41 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 15 septembre 2008 - 2 juil. 2007 à 18:45
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 3 juil. 2007 à 10:07
Bonsoir,

Voilà, j'ai un usercontrol qui me trace un graphique que j'insère après dans mon MainForm. Quand je clique sur le graphique je fais un Zoom par 2 (+ ou -) via un évènement mousedown (dans le usercontrol).
Mon graphique me prend en gros 2 à 3 MO de mémoire que je nettoie (dispose) à chaque fois que je change de tracé. Mais si je m'amuse avec des zooms dans un sens et dans l'autre (histoire de jouer un peu) j'ai ma mémoire qui part en flèche... je me suis arrêté à 400MO.

avez vous une idée de ce que cela peut être ??

voici le code du zoom :

            void FondMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
            {
                try {
                    if (ZZoomActif == false) {
                        return;
                    }
                    if (e.Button == MouseButtons.Left) {
                        if (Fond.Width > 4000) {
                            return;
                        }
                        Fond.Dock = System.Windows.Forms.DockStyle.None;
                        Fond.Left = -(Math.Abs(Fond.Left) + e.X);
                        Fond.Width = Fond.Width * 2;
                        Fond.Top = -(Math.Abs(Fond.Top) + e.Y);
                        Fond.Height = Fond.Height * 2;
                        if (Fond.Width <= this.Width) {
                            Fond.Left = 0;
                        }
                        if (Fond.Height <= this.Height) {
                            Fond.Top = 0;
                        }
                    }else if (e.Button == MouseButtons.Right) {
                        if (Fond.Width <= this.Width) {
                            return;
                        }
                        Fond.Dock = System.Windows.Forms.DockStyle.None;
                        Fond.Left = -(Math.Abs(Fond.Left) - e.X / 2);
                        Fond.Width = Fond.Width / 2;
                        Fond.Top = -(Math.Abs(Fond.Top) - e.Y / 2);
                        Fond.Height = Fond.Height / 2;
                        if (Fond.Width <= this.Width) {
                            Fond.Left = 0;
                            Fond.Width = this.Width;
                        }
                        if (Fond.Height <= this.Height) {
                            Fond.Top = 0;
                            Fond.Height = this.Height;
                        }
                    }
                } catch {
                }
            }

je ne vois pas la dedans ce qui fait augmenter la mémoire.

où ce la se passe t il dans mon évènement paint :

            void FondPaint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                if (!(ZRafraichi)) {
                    return;
                }
                Image = new Bitmap(Fond.Width, Fond.Height);
                Graphics g = Graphics.FromImage(Image);
                Graphics gf = Fond.CreateGraphics();
                g.SmoothingMode = SmoothingMode.AntiAlias;
                try {
                    this.CalculMargeGauche(g);
                    this.CalculMargeDroite();
                    this.CalculMargeHaute();
                    this.CalculMargeBasse(g);
                    DessineFond(g);
                    DessineGrille(g);
                    DessineAxe(g);
                    DessineElements(g);
                    gf.DrawImage(Image, 0, 0);
                    g.Dispose();
                    gf.Dispose();
                } catch (Exception ex) {
                    MessageBox.Show(ex.Message);
                }
   
            }

Merci d'avance
RB

10 réponses

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
2 juil. 2007 à 19:19
Déjà, tu devrais mettre tes appels à Dispose() dans un block finaly, parce que en cas d'exception tu ne nettoye rien...
Sinon tu ne "dispose" pas Image (dans l'ordre, il vaut mieux appeler les dispose dans l'ordre inverse des "new" -> tu dispose en premier le dernier objet créé)

<hr size="2" width="100%" />Working as designed
3
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
2 juil. 2007 à 19:04
Salut,
A ta place, je dessinerais sur un bmp à la taille que tu veux, puis je dessinerais le bmp sur le controle en jouant sur Graphics.ScaleTransform pour le zoom.

<hr size="2" width="100%" />Julien.
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
2 juil. 2007 à 19:20
(finally avec 2 'l'...)

<hr size="2" width="100%" />Working as designed
0
rbidocho Messages postés 41 Date d'inscription jeudi 7 juin 2007 Statut Membre Dernière intervention 15 septembre 2008
2 juil. 2007 à 19:36
Merci NikOui...

Comme quoi des Dispose bien placé ça change tout surtout le Image.Dispose()

Quant à Julien 237, je vais regarder ça de plus près. si ça me simplifie la vie ->OK.

RB
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
2 juil. 2007 à 21:43
Vu que t'es en C# je peux te proposer une alternative qui va te parraitre contrainiante :
premiere chose active le code unsafe puis créé un block mémoire de type pointeur qui gere les couleur et ensuite utilise les fonction BitBlt et la "enjoy" tu gagne enormement en rapidité et en place mémoire.
J'ai codé dernierement une appli qui recré un simulacre de la baguette magique de sélection de paint avec le GDI Managé c'est horrible je suis en train de le passer en unsafe ca va deja mieux même si c'est aps encore fini
pour avoir le courage de trouver comment faire :
www.getpaint.net
c'est opensource c'est en C# ca tourne sous XP, Vista, x86 et x64 enfin voila (par contre faut BIEN lire TOUS les readme pour reussir a le compiller :p)

TeBeCo
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
2 juil. 2007 à 21:46
En même temps, tu crées un bitmap et tu appele LockBits, tu obtient un tableau de bytes qui fait exactement pareil en managé...

<hr width="100%" size="2" />Julien.
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
3 juil. 2007 à 07:12
sauf que la rapidité n'est vraiment pas du tout la même et niveau mémoire tu sais ce que tu créé

TeBeCo
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
3 juil. 2007 à 10:05
<hr size="2" width="100%" />

Julien.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
3 juil. 2007 à 10:06
<hr size="2" width="100%" />

Julien.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
3 juil. 2007 à 10:07
Et avec FireFox, ça bug aussi ?
Désolé pour ces deux posts... TeBeCo, je te propose un pari en mp

<hr size="2" width="100%" />Julien.
0
Rejoignez-nous