IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Mémoire utilisée halucinante


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Mémoire utilisée halucinante
    Bonjour,

    j'ai commencé à codé un petit jeu.
    Pour représenter celui ci graphiquement j'utilise le GDI.
    Afin d'éviter les clignotements je créer un bitmap, et je dessine dedans pour plus tard afficher le bitmap dans ma pictureBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //g : mon graphics, b : bitmap tampon
    b = new Bitmap(Game.Width, Game.Height);
    g = Graphics.FromImage(b);
     
    g.DrawLine(new Pen(color.black),10,10,100,100);
     
    //Dessin
    e.Graphics.DrawImage(b, 0, 0);
    Voila ma situation, j'ai une matrice de int que je dessine (exemple : si matrice[i][j] = 0, alors dessiner monTableauBitmap[1] )
    Mon tableau bitmap contient une 10aine de bitmaps (des gifs de 32x32)

    En gros 100 à 200 bitmap sont dessinés dans ma pictureBox et rafraichit sans arrêt.

    LE PROBLEME : Ma mémoire vive pète les plomb, j'exécute mon prog, la ram utilisée par mon jeu commence à 200mo, elle monte en flèche jusqu'à 1go+.
    Une fois arrivée à 1go elle retombe à 200mo, puis remonte jusqu'à 1go de la méme façon, et ainsi de suite.

    Dans mon programme je ne remarque aucun ralentissement ni autre problème.

    Merci d'avoir lu, a+

    Edit : mes .gifs pèsent en moyenne 100octets

  2. #2
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Hello,
    Ce n'est pas surprenant, comme comportement, car tu crées un nouvel objet Bitmap à chaque fois. Tu alloues la mémoire plus vite que le GarbageCollector ne la libère, en somme.
    Je pense que tu pourrais optimiser ta méthode de dessin; pourquoi ne pas créer ton propre Control personnalisé et gérer tes graphismes dans la méthode Paint() ?

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    la classe bitmap utilise des ressources de windows (mémoire non managée), pour la libérer il faut appeler .dispose dessus dès que tu n'en plus l'utilité
    sinon la mémoire grimpe rapidement ...

    le garbage collector arrivera a vider la mémoire tout comme il y arrive pour la mémoire managée mais ca peut etre un peu long

    si tu ne sais pas à quel moment tu n'as plus besoin des variables ou que tu n'as pas envie de chercher, il y a la méthode moins propre, appeler GC.Collect de temps en temps, le mieux étant sur un thread séparé car ca peut prendre quelques centaines de millisecondes

    le mieux serait que tu gardes le même bitmap à chaque tour, ca éviterait d'en créer et d'en détruire tout le temps

    et sinon il y a une classe faite pour gérer son buffer : System.Drawing.BufferedGraphics (là aussi c'est non managé, donc le mieux est d'en avoir un seul et de le créer sur le sizechanged en détruisant éventuellement l'ancien)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    D'accord je comprend ! Je pensais que le "ramasse-miette" supprimait l'ancien bitmap après que je fasse b = new Bitmap.

    En effet j'ai déclaré mon bitmap au chargement de l'appli plutôt qu'a chaque rafraichissement de l'image, la mémoire va mieux maintenant, 10mo et quelques constamment

    Merci de m'avoir éclairé ! A Bientot

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. la mémoire utilisée par un processus
    Par LN(a) dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 22/04/2006, 14h28
  2. minimiser la mémoire utilisée pour stocker de l'information
    Par midy dans le forum Général Python
    Réponses: 3
    Dernier message: 30/01/2006, 15h17
  3. [Info]Mémoire utilisée
    Par lr dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 24/10/2005, 10h34
  4. Supprimer la mémoire utilisée par les variables globales
    Par dnaprotector dans le forum OpenGL
    Réponses: 4
    Dernier message: 21/07/2005, 13h18
  5. [Info][Mémoire] utilisée pour un pointeur null
    Par thomas_strass dans le forum Langage
    Réponses: 14
    Dernier message: 04/11/2004, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo