J'ai un objet et je veux simplement le détruire sur un événement. Comment appeler le destructeur dans Xna? P>
7 Réponses :
Définir la référence à cet objet à null code>. p>
Définissez l'objet sur comme une note latérale, si l'objet est quelque chose que vous créez souvent (ennemis, balles, etc.), vous voudrez peut-être utiliser un piscine au lieu de supprimer l'objet. Cela signifierait que cet objet est recyclé et que le collecteur des ordures est appelé moins souvent, ce qui augmentera les performances. P> null code> et le collecteur de déchets le ramassera sur son prochain exécution. P>
Omg, c'est la dernière chose que vous voulez faire dans .net
foreach (kour dym dans Smokelist) {dym.cas + = gamétime.elapsedgametime; if (dymp.cas> tispan.fromseconds (0.5)) {dym = null; }}
@Nick Berardi - Pourriez-vous expliquer pourquoi s'il vous plaît, puisqu'il s'agit-il d'un bowvote? Pourquoi référencer un petit nombre d'objet à null code> et la recommandation de l'utilisation d'un pool code> code> La dernière chose que vous voulez faire? @Nassgharet - Qu'est-ce qui ne fonctionne pas? En outre,
Smokelist code> ressemble à un système de particules. Vous devez utiliser la mise en commun, pas
null code> sur tous les objets si c'est le cas.
Parce que comme @nasgharet a indiqué définir un objet sur null code> ne fait que la mémoire .NET sage, c'était une idée fausse commune apportée des jours C et C ++ de certains programmeurs. Le seul moyen de mettre un objet sur un processus de finalisation pour le GC est de le laisser tomber hors de portée.
@Nashgharet La raison pour laquelle il ne fonctionne pas dans votre cas est que le gestionnaire d'événements conserve l'objet dans la portée car l'événement n'est jamais débouché de l'objet. Vous devez appeler - = pour supprimer l'événement avant de pouvoir être collecté.
@Nick Berardi - Non, il n'a pas d'effet immédiat sur la mémoire. La question était de détruire l'objet (c'est-à-dire perdre référence) dans le jeu (puisque c'est xna code>). Le motif isisposable est certainement valable pour l'élimination, mais OP n'était pas préoccupé par la suppression de la mémoire, détruisant plutôt l'objet. Forcer le GC est insouciant dans un jeu en temps réel (ESP sur Xbox / WP7) et
la mise en commun code> est toujours meilleur que
disposant code> (Common Objs). Il n'y a pas besoin de définir comme
NULL code> à partir d'une perspective de mémoire nécessairement, mais cela aide lorsque vous essayez de supprimer un ennemi du jeu. Quand une balle sortait-elle automatiquement?
Voir cet exemple sur mon commentaire pour utiliser comment utiliser des références faibles au lieu des fortes références que vous utilisez actuellement avec votre gestionnaire d'événements. Stackoverflow.com / Questions / 6269427 / ...
@KeyboardP de quoi vous parlez est des considérations de conception et non le nettoyage de la mémoire, et 2e l'exemple qu'il a donné ne libérera jamais la dym code> objet code> jusqu'à ce que l'objet gamétime code> a été libéré, en raison de la forte référence créée par le gestionnaire d'événements. Il s'agit d'un problème courant que les modèles entraînés par l'événement provoquent, alors même si vous le définissez sur
null code>, il ne sera pas libéré que
gamétime code> est libéré.
@Nick Berardi - Je suppose que nous avons transversalement câblé. J'ai supposé que l'OP lui demandait une perspective de se débarrasser d'un objet du jeu, pas nécessairement de la mémoire POV. C'est pourquoi j'ai suggéré de mettre en commun, surtout si vous allez en boucle sur les objets (il y a de fortes chances, il existe de nombreuses quantités).
@KeyboardP Pourquoi pensez-vous que l'on voudrait même jamais vouloir détruire l'objet code>? Il s'agit de faire des choses qui doivent être faites après la disparition de l'objet - c'est-à-dire des descripteurs de réseau / fichier proches, etc. Afaik c # n'a toujours pas un moyen de faire cela (il y a une solution de contournement avec Idisposable, mais c'est très Error-Preone, car le compilateur ne prévoit même pas de programmeur à utiliser
en utilisant code> avec de telles classes) i>.
Après avoir défini l'objet sur null code>, si vous voulez pour une raison quelconque, l'objet à collecter immédiatement, appelez
gc.collect () code>. p>.
Pas de bons conseils génériques. Appeler GC.Collect ne garantit pas qu'il collectera de toute façon et peut en réalité finir par créer plus de problèmes que ce qu'il vaut la peine.
@Gregory A Beamer de MSDN sur GC.Collect Code>: "Force une collection immédiate des ordures de toutes générations." I>. Bien sûr, tout dépend d'une situation si
gc.collect code> devrait être appelé ou non. Par exemple. Si un objet consomme beaucoup de mémoire qui devrait être libéré aussi vite que possible,
gc.collect code> est utile.
Laissez-moi ammer ma déclaration énoncée à la hâte. GC PAS GUERANTEIVER DE NETTOYER DES OBJETS UPS. J'aime les règles de Rico pour la collecte des ordures: blogs.msdn. COM / B / RICOM / Archive / 2004/11/29/71829.aspx
Bien que votre kilométrage puisse varier, ma préférence est d'utiliser Voir cette ressource sur http://msdn.microsoft.com/fr- US / Bibliothèque / System.GC.SuppressFinalize.aspx P> Idisposable code> et
Dispose () code> d'objets que je n'avais plus besoin. Ceci est esp. True lorsque vous utilisez des ressources non gérées, mais que vous avez le
Dispose () code> configuré déclare l'intention. p>
gc.suppressfinalize code> pour un bon exemple de comment implémenter
Idisposable code>. p>
En plus d'utiliser simplement l'utilisation, vous pouvez aller de l'avant et suivre le motif jetable afin que vous puissiez libérer de l'objet à volonté, mais s'il est hors de portée, il est pris en charge par le GC.
Quel genre d'objet? Si vous êtes disponible / Idisposable, vous devez appeler objet.Dispose () Sinon, vous pouvez simplement utiliser objet = null, et il sera "nettoyé" automatiquement. Ce n'est pas c vous travaillez dans;) p>
Si votre «objet» est en fait une classe complexe ou quelque chose avec plus d'objets, vous voudrez peut-être envisager de le faire une classe isisposable. P>
Si l'objet détient toutes les ressources non gérées, implémentez S'il ne contient pas de ressources non gérées, le collecteur des ordures le prétendra "à un moment donné" lorsqu'il n'y a plus de références à cela. P>
GC.Collect () rendra le collecteur des ordures collectant et il "détruire" votre objet s'il n'y a pas de références à cela. Ce n'est pas une très bonne idée puisqu'il a des conséquences sur la performance (il faut du temps et favorise d'autres objets dans une génération plus élevée qui les rendent plus longtemps en mémoire avant d'être récupéré). P>
Pourquoi avez-vous besoin de l'objet détruit à un certain temps fixe? p> Idisposable code> (et utilisez
à l'aide de code> ou appelez
jetez () code> dessus lorsque vous avez terminé avec elle). P>
Ce que vous voulez faire est d'appeler http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx p> Si vous avez vraiment besoin de prendre des ordures recueillies correctement Suivant: P> gc. Suppropefinisize () Code>
Si vous gérez le nettoyage vous-même ... Habituellement, vous utilisez gc.suppressfinalize () code> dans un
classe Idisposable code>. Voir cet exemple de code pour l'utilisation courante de
Idisposable code>:
dym.cas += gameTime.ElapsedGameTime;