Problème mémoire avec fonction zoom

[Résolu]
Signaler
Messages postés
41
Date d'inscription
jeudi 7 juin 2007
Statut
Membre
Dernière intervention
15 septembre 2008
-
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
-
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

Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
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
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
(finally avec 2 'l'...)

<hr size="2" width="100%" />Working as designed
Messages postés
41
Date d'inscription
jeudi 7 juin 2007
Statut
Membre
Dernière intervention
15 septembre 2008

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
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

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
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.
Messages postés
467
Date d'inscription
lundi 24 juin 2002
Statut
Membre
Dernière intervention
9 mars 2011

sauf que la rapidité n'est vraiment pas du tout la même et niveau mémoire tu sais ce que tu créé

TeBeCo
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
<hr size="2" width="100%" />

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

Julien.
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
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.