Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation

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
Lassé par la pub ? Créez un compte
Expert Programmation

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.

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
Expert Programmation

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 ;) 

Lassé par la pub ? Créez un compte
Tom's guide dans le monde