Se connecter / S'enregistrer
Votre question

[Base de programmation]Question sur la méthode Dispose()...

Tags :
  • Générique
  • Programmation
Dernière réponse : dans Programmation
23 Avril 2008 17:18:19

Bonjour à tous amis développeurs,

Je suis actuellement en train de développer un petit jeu avec XNA juste pour m'éclater...Seulement je rencontre un gros problème de compréhension:

Lorsque je charge une texture et que je ne m'en sert plus par la suite, j'apelle la méthode Dispose de ma texture. Seulement, lorsque je tente de recréer un autre objet (avec nouvelle instance et tout le tralala d'initialisation), celui-ci voit sa propriété "IsDisposed" toujours égale à True ce qui abouti inévitablement a un plantage du jeu!!

J'aurais aimé avoir vos lumière sur la fonctionnalité précise de cette méthode Dispose()...Je ne pense pas qu'il soit nécessaire que je détaille d'avantage le contexte étant donné que cette méthode Dispose est une sorte de "nom générique" qu'on retrouve partout. Son utilité doit etre identique dans tous les langages, peu importe l'application (Entre Java et C#en tout cas, c'est le cas)

Merci d'avance

Autres pages sur : base programmation question methode dispose

a b L Programmation
23 Avril 2008 20:05:05

Au lieu de "Base de programmation", met plutôt "C#/XNA" :) 

les méthodes Dispose() permettent de supprimer certaines parties de mémoire. Je ne connais pas XNA, mais je pense qu'il ne faut pas appeler ta méthode si tu te ressert de l'objet ! Soit tu ne fait le Dispose que lorsque tu es sûr de ne plus l'utiliser, soit tu crées un nouveau objet texture pour la même texture.
23 Avril 2008 23:56:01

Hé bien...Le truc c'est que, au moment où je dispose les ressources en question je ne peux etre sur de rien. Soit l'utilisateur continue dans sa lancée d'une création de nouvelle partie auquel cas je suis certain de disposer les ressources pour un bout de temps assez important...Soit il fait retour...

Ce que je trouve bizarre quand même, c'est que même si je déréferrence l'objet contenant ma ressource (et donc via les appels de méthodes successif, que je déréferrence tout ce qui se trouve dans cet objet...) puis que je crée un nouvel objet avec une nouvelle instance et tout ça (donc a priori, de nouvelles zones mémoire allouées), ça conserve la référence de ma ressource O_o.

Soit c'est moi qui ait codé ça à la louche...Soit c'est XNA qui fait mal son boulot (ça serait pas étonnant non plus...Simplicité de XNA = perte de 8~10Ko de mémoire environ toutes les secondes, et ce, jusqu'a avoir consommé entre 4 et 6Mo de mémoire supplémentaire juste en déplaçant le curseur de la souris dans la fenêtre -_-).

Enfin bon, l'appel ou non de la méthode Dispose sur ma ressource ne semble pas avoir beaucoup d'effet en mémoire, je vais simplement m'en passer ^^. On verra par la suite.

Merci pour ta réponse et @bientot
a b L Programmation
24 Avril 2008 20:38:52

Citation :
Hé bien...Le truc c'est que, au moment où je dispose les ressources en question je ne peux etre sur de rien. Soit l'utilisateur continue dans sa lancée d'une création de nouvelle partie auquel cas je suis certain de disposer les ressources pour un bout de temps assez important...Soit il fait retour...

Dans tous les jeux, les ressources sont rechargées pour justement éviter de prendre trop de mémoire. Si tu veux absolument conserver les textures chargées, alors ne les libèrent pas (mais ça risque de vite prendre beaucoup de mémoire).

Citation :
Ce que je trouve bizarre quand même, c'est que même si je déréferrence l'objet contenant ma ressource (et donc via les appels de méthodes successif, que je déréferrence tout ce qui se trouve dans cet objet...) puis que je crée un nouvel objet avec une nouvelle instance et tout ça (donc a priori, de nouvelles zones mémoire allouées), ça conserve la référence de ma ressource O_o.

le Dispose permet de supprimer les éléments dit "non managés". En fait ce sont les éléments créés classiquement, sans utiliser le framework .NET. Du coup, même si tu déréférence un objet, tu ne nettoie pas correctement l'objet (et donc, je ne suis pas sûr même que l'objet est réellement déréférencé).

Citation :

Soit c'est moi qui ait codé ça à la louche...Soit c'est XNA qui fait mal son boulot (ça serait pas étonnant non plus...Simplicité de XNA = perte de 8~10Ko de mémoire environ toutes les secondes, et ce, jusqu'a avoir consommé entre 4 et 6Mo de mémoire supplémentaire juste en déplaçant le curseur de la souris dans la fenêtre -_-).

Le memory leak c'est très courant. Avant d'accuser les autres, on vérifie chez soi ;) 

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS