Comment appeler le destructeur en C # XNA
J'ai un objet et veulent simplement le détruire sur certains événements. Comment appeler le destructeur de XNA?
Vous devez vous connecter pour publier un commentaire.
J'ai un objet et veulent simplement le détruire sur certains événements. Comment appeler le destructeur de XNA?
Vous devez vous connecter pour publier un commentaire.
Définir l'objet de
null
et le Garbage Collector va ramasser sur l'exécution suivante.Comme une note de côté, si l'objet est quelque chose que vous créez souvent des ennemis, des balles, etc..), vous souhaiterez peut-être utiliser un piscine au lieu de la suppression de l'objet. Cela signifie que l'objet est recyclé, et donc, le garbage collector s'appelle moins souvent, ce qui permettra d'augmenter les performances.
null
et de la recommandation de l'utilisation d'unpool
la dernière chose que vous voulez faire? @Nasgharet - Ce qui ne fonctionne pas? Aussi,smokeList
sonne comme un système de particules. Vous devez utiliser le regroupement, pasnull
sur tous les objets si c'est le cas.null
ne fait rien en .NET mémoire de sage, c'était une idée fausse commune apportés depuis le C et le C++ jours de certains programmeurs. Le seul moyen de mettre un objet sur un Finaliser le processus pour la GC, c'est de laisser tomber hors de portée.XNA
). La IDisposable modèle est certainement valable pour le retrait, mais l'OP n'était pas concerné par la mémoire de suppression, plutôt de destruction de l'objet. En forçant le GC est négligent dans un temps réel de jeu (esp sur XBox/WP7) etpooling
est toujours mieux que dedisposing
commune(objs).Il n'y a pas besoin de définir commenull
à partir d'un point de vue de la mémoire nécessairement, mais il est utile lorsque vous essayez de supprimer un ennemi du jeu. Quand une balle hors de portée automatiquement?dym
objet jusqu'à ce que legameTime
objet a été libéré, en raison de la forte référence créée par le gestionnaire d'événement. Ce est un problème commun qui événement piloté par les modèles de la cause, de sorte que même si vous le réglez ànull
il ne sera pas obtenu libéré jusqu'à ce quegameTime
est libéré.destroy the object
? C'est de faire des choses qui doivent être fait après que l'objet a disparu — c'est à dire à proximité du réseau/des descripteurs de fichiers, et etc. Autant que je sache, C# n'ont toujours pas le moyen de le faire (il y a une solution de contournement avec IDisposable, mais il est très enclin à l'erreur, parce que le compilateur n'a même pas avertit un programmeur d'utiliserusing
avec de telles classes).Pendant que votre kilométrage peut varier, ma préférence va à l'utilisation
IDisposable
etDispose()
d'objets, je n'ai plus besoin. C'est l'esp. vrai lorsque vous êtes en utilisant des ressources non managées, mais ayant laDispose()
configurer déclare intention.Voir cette ressource sur
GC.SuppressFinalize
pour un bon exemple de la façon de mettre en œuvreIDisposable
.http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
Définir une référence à cet objet pour
null
.Après la définition de l'objet de
null
, si vous souhaitez pour une raison quelconque la collecte de l'objet immédiatement, appelezGC.Collect()
.GC.Collect
: "les Forces immédiate de collecte des ordures de toutes les générations.". Bien sûr, tout dépend de la situation siGC.Collect
doit être appelé ou pas. E. g. si un objet consomme beaucoup de mémoire qui doit être libéré aussi rapidement que possible,GC.Collect
est utile.Ce genre d'objet? Si c'est un Jetable/IDisposable vous devriez objet d'appel.Dispose()
Sinon, vous pouvez simplement utiliser l'objet=null, et il sera "nettoyé" automatiquement. Ce n'est pas C vous travaillez 😉
Si votre "objet" est en fait un complexe de classe ou quelque chose avec plus d'objets, vous pourriez envisager de faire un IDisposable classe.
Si l'objet contient toutes les ressources non managées puis de mettre en œuvre
IDisposable
(et l'utilisation deusing
ou appelezDispose()
sur lorsque vous avez terminé avec elle).Si elle ne tient pas les ressources non managées puis le garbage collector prétendent qu'il "a un certain point" quand il n'y a pas plus de références.
GC.Collect() fera le garbage collector de recueillir et de "détruire" votre objet si il n'existe pas de références. Ce n'est pas une très bonne idée car elle a des implications sur les performances (il faut du temps et de la promotion d'autres objets en plus de la génération de faire durer plus longtemps dans la mémoire avant d'être récupérée).
Pourquoi avez-vous besoin de l'objet détruit, à une certaine heure fixe?
Ce que vous voulez faire est d'appeler
GC.SuppressFinalize()
si vous manipulez le nettoyage vous-même... en général, vous utilisezGC.SuppressFinalize()
au sein d'uneIDisposable
classe. Voir cet exemple de code pour l'usage commun de laIDisposable
:http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
Si vous avez vraiment besoin de l'avoir nettoyée immédiatement:
Mais je dois vous avertir que vous devriez vraiment laisser l'objet hors de portée, et de laisser le GC collecter les objets naturellement. L' .NET est très efficace à la gestion de la mémoire tant que vous n'essayez pas de faire son travail.
MODIFIER
Après avoir examiné les commentaires, je vois que vous avez oublié de laisser une pièce importante d'informations, que vous avez été la liaison de l'objet en question à d'autres objets, méthodes. Cela signifie que l'objet que vous essayez de finaliser ne va pas à finaliser jusqu'à ce que la méthode utilisée pour regarder l'événement a finalisé, gardant ainsi autour d'une tonne d'objets supplémentaires dans la mémoire.
Ce que vous pouvez faire pour briser cette forte référence est l'utilisation d'un objet appelé
WeakReference
. Ou utiliser les lambdas à briser les références fortes.Voir pour un exemple d'utilisation d'un WeakReference
http://msdn.microsoft.com/en-us/library/system.weakreference.aspx
Ou vous pouvez faire quelque chose comme ceci:
au lieu de