Fuite mémoire [Résolu]

le5ejumeau 130 Messages postés mardi 11 mars 2003Date d'inscription 9 juillet 2009 Dernière intervention - 31 août 2007 à 17:29 - Dernière réponse : le5ejumeau 130 Messages postés mardi 11 mars 2003Date d'inscription 9 juillet 2009 Dernière intervention
- 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 
Afficher la suite 

Votre réponse

4 réponses

cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 31 août 2007 à 23:44
+3
Utile
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
*/
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_coq
le5ejumeau 130 Messages postés mardi 11 mars 2003Date d'inscription 9 juillet 2009 Dernière intervention - 1 sept. 2007 à 11:13
0
Utile
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
 
Commenter la réponse de le5ejumeau
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 1 sept. 2007 à 12:58
0
Utile
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
*/
Commenter la réponse de cs_coq
le5ejumeau 130 Messages postés mardi 11 mars 2003Date d'inscription 9 juillet 2009 Dernière intervention - 1 sept. 2007 à 16:40
0
Utile
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
Commenter la réponse de le5ejumeau

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.