Fuite mémoire [Résolu]

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

Votre réponse

4 réponses

Meilleure réponse
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 31 août 2007 à 23:44
3
Merci
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
*/

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de cs_coq
Messages postés
130
Date d'inscription
mardi 11 mars 2003
Dernière intervention
9 juillet 2009
- 1 sept. 2007 à 11:13
0
Merci
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
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
- 1 sept. 2007 à 12:58
0
Merci
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
Messages postés
130
Date d'inscription
mardi 11 mars 2003
Dernière intervention
9 juillet 2009
- 1 sept. 2007 à 16:40
0
Merci
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.