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

DirectX Discussion :

Gestion de la mémoire : augmentation permanente de la taille


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut Gestion de la mémoire : augmentation permanente de la taille
    Joyeux réveillon à tous !

    Oui je programme même le 24/12, cependant j'ai un problème de mémoire, en effet lorsque je mets ce code dans mon render, la mémoire du processus ne fait qu'augmenter, pourtant j'ai bien effectuer des Dispose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sprite = new Sprite(device);			  
     
    			  sprite.Begin(SpriteFlags.None);
    			  sprite.Draw2D(texture, new Rectangle(0, 0, 100, 20), Rectangle.Empty,
    			              new Point(5, 5), Color.White);
    			  sprite.Draw2D(texture, new Rectangle(0, 0, 10, 100), Rectangle.Empty,
    			              new Point(105, 25), Color.White);
    			  sprite.End();
    			  sprite.Dispose();
    			  texture.Dispose();
    Pouvez vous me dire ce qui fait augmenter l'utilisation de la mémoire par mon application ?

    Merci

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    A premiere vue je dirais que faire à chaque rendu:

    sprite = new Sprite(device);

    ça doit créer des milliers de sprites en quelques secondes. Quand tu utlises l'opérateur New tu dois ensuite utiliser Delete.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut
    Ah merci bien pour ta réponse ! je pensai quue dispose remplissait ce rôle ; je vais donc appliquer Delete.

    Merci et bonnes fêtes !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut
    Non, y a un petit problème, c'est qu'en C# la méthode Delete() appliquée à Sprite n'existe pas.

    Comment peut on supprimer un objet créé en C#, si c'est bien la cause la surcharge de RAM ?

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Désolé je ne connais pas c#...


  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 26
    Points : 18
    Points
    18
    Par défaut
    y a pas

    delete pointer;
    (donc delete sprite; dans ton cas)

    en C# ? :

    PS: Si y a new pointer; doit forcément avoir delete pointer; ...

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Bon les gens qui ne font pas de C#, arrêtez de répondre à côté

    Je n'en fais pas non plus, mais de ce que j'en sais il n'y a ni Delete ni delete, pour libérer une ressource c'est Dispose() comme le fait notre ami.

    Pour essayer de répondre : je ne sais pas comment fonctionne le garbage collector, mais peut-être que ce sont les new Rectangle(...) et new Point(...) qui ne sont pas libérés ? Sinon es-tu sûr que ce soit cette portion de code qui pose problème ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut
    Oui je suis sûr que c'est cette portion. Ce que j'ai remarqué ce que si par exemple, toujours au niveau du render si je déclare une Font en local (dans le render donc) avec une instanciation (new) et que je demande d'afficher un simple caractère, et bien la mémoire se remplit à vue d'oeil ! Conclusion, c'est bien le new qui pose problème ! Car si je déclare en public cette même Font, donc sans New() dans le render, ça s'affiche impécable et sans prendre plus de mémoire.

    Ce que je ne comprends pas, c'est que normalement quand on déclare des variables dans une fonction, elles sont en local et la mémoire allouée est libérée à la fin de l'appel...

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dans ce cas ce que tu peux essayer c'est d'enlever les lignes qui posent problème une à une, regarder ce que ça donne et ainsi isoler les éléments "perturbateurs".

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Points : 75
    Points
    75
    Par défaut
    J'ai trouvé c'est le TextureLoader.FromFile() qui faisait ralentir. Je l'ai mis dans InitializeGraphics et ça tourne nickel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texture = TextureLoader.FromFile(device, @"image.jpg");

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    1- Ca n'était effectivement pas dans le code que tu nous avais donné

    2- Effectivement, charger des ressources à toutes les frames ce n'est généralement pas une bonne idée . Ca se fait toujours une seule fois lors de l'init.

  12. #12
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    sinon que ce soit en C++, ou en C#, appeler new a un certain cout et donc il faut éviter de l'appeler à tout bout de champ (genre un million de fois par frame) si l'on veut obtenir des bonnes performances et surtout ne pas mettre à genou le garbage collector.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

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

Discussions similaires

  1. Réponses: 17
    Dernier message: 02/02/2006, 13h03
  2. Gestion de la mémoire ?
    Par portu dans le forum Langage
    Réponses: 7
    Dernier message: 01/06/2005, 12h19
  3. gestion de la mémoire
    Par moldavi dans le forum C++
    Réponses: 17
    Dernier message: 05/02/2005, 00h18
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 16h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 13h44

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