Fuite mémoire

Résolu
le5ejumeau Messages postés 130 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 9 juillet 2009 - 31 août 2007 à 17:29
le5ejumeau Messages postés 130 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 9 juillet 2009 - 1 sept. 2007 à 16:40
Bonjour à tous,

J'ai codé un petit bout de code qui dessine à l'ecran un rectangle et le fait bouger. le probleme c'est que la mémoire aloué à mon application ne fait qu'augmenter et je n'arrive pas à resoudre le probleme. pouvez vous m'aider?

voila le petit bout de code :
pctJeux etant une picturebox

   private BufferedGraphics o_buffer;

        private Int32 i_X  = 0;

        private Int32 i_Y  = 400;

        private Thread o_jeu;

        public Form1()

        {

            InitializeComponent();

            o_buffer = BufferedGraphicsManager.Current.Allocate(pctJeux.CreateGraphics(), pctJeux.DisplayRectangle);

            o_buffer.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            o_jeu = new Thread(new ThreadStart(Jouer));

            o_jeu.Priority = ThreadPriority.Normal;

            o_jeu.Start();

        }

     

        private void Jouer()

        {

            Graphics g = null;

            while(Thread.CurrentThread.IsAlive){

                g = o_buffer.Graphics;

                g.Clear(Color.Black);

                g.DrawRectangle(new Pen(Brushes.Red, 10), i_X, i_Y, 100, 10);

                o_buffer.Render();

            }

        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)

        {

            if (e.KeyData  == Keys.Right)

                i_X += 10;

            else if (e.KeyData == Keys.Left)

                i_X -= 10;

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)

        {

            o_jeu.Abort();

            o_buffer.Dispose();

        }

merci de voter aide 

4 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
31 août 2007 à 23:44
Salut,


Ce n'est pas nécessairement une fuite, suivant la configuration de la machine utilisée pour les tests, le GC n'a pas forcément besoin de perdre du temps à libérer "instantanement" ce qui est libérable.


Sinon :
g.DrawRectangle(new Pen(Brushes.Red, 10), i_X, i_Y, 100, 10);
Quel est l'intérêt de recréer le même stylo à chaque fois ?

Autres questions :
- as tu vraiment besoin d'enchainer les dessins à cette fréquence là ?
- as tu vraiment besoin d'utiliser un contrôle PictureBox (censé afficher une image) comme surface de dessin ?

/*
coq
MVP Visual C#
CoqBlog
*/
3
le5ejumeau Messages postés 130 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 9 juillet 2009
1 sept. 2007 à 11:13
Merci coq pour cette réponse.  C'est vrai j'avais pas pensé à cà. le GC ne va pas libérer de la mémoire si cela n'est pas nécessaire.

effectivement, je n'ai pas besoin de recréer mon stylo à chaque fois.
 
Par contre pour l'anchainement des images,  l'idée c'était de faire un casse-brique et de faire un processus avec une boucle qui s'occupe de faire bouger la balle.

Par contre pour l'utilisation d'un picture box je sais pas, c'etait pour moi le plus logique. C'est mieux de dessiner directement sur la form ?

merci
 
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
1 sept. 2007 à 12:58
Ba si le picturebox n'affiche rien oui, consommer des ressources pour dessiner sur une surface vierge n'a pas réellement de sens.
Par contre tu utilises GDI+ pour faire un jeu, n'aurais tu pas intérêt à regarder du côté de DirectX / XNA ? (à moins que GDI+ soit requis)

Ma remarque sur le rafraichissement portait sur le fait que dès que tu as fini de faire le rendu tu recomences directement, alors qu'au final l'oeil humain ne pourra pas toutes les voir.

/*
coq
MVP Visual C#
CoqBlog
*/
0
le5ejumeau Messages postés 130 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 9 juillet 2009
1 sept. 2007 à 16:40
D'accord je comprend, afficher plus de 50 images par secondes sa sert pas à grand chose. Je vais me pencher sur XNA je connais pas donc ca va pas me faire de mal d'apprendre à programmer pour la xbox. ...

Merci de tes conseils
0
Rejoignez-nous