C# Comment faire pour supprimer complètement de l'objet à partir de la mémoire
J'ai une application en C# constitué d'un Pivot avec plusieurs Pivotitems. La normale Pivotitems décharger correctement et de ne pas présenter une fuite de mémoire. Sur deux des éléments si, j'ai Drawingsurfaces sur lequel j'utilise Monogame à rendre les modèles 3d. Après le déchargement et le chargement de leurs pivots, je suis en train de la détruire complètement, puis recréer complètement le "Jeu" des instances (principalement parce que Monogame ne vous autorise pas à tirer des deux surfaces à l'instant, et parce qu'ils utilisent beaucoup de mémoire et il n'est pas assez pour eux deux).
Mon problème vient que lorsque je me débarrasser de la Xamlgame qui est créée lors du chargement, il ne libère pas toute la mémoire qu'il a utilisés. Cela signifie que chaque fois que je recréer le Xamlgame il commence juste à l'aide de plus en plus de mémoire jusqu'à ce qu'il n'y est pas plus de gauche. Donc, je voudrais savoir si il y a C# façon d'en disposer de toute la mémoire qui a été pris en utiliser lors du chargement d'un objet.
Tout Monogame manière spécifique serait également appréciée. Pour le moment, je suis d'abord disposer de mon vertex et l'index de la mémoire tampon, puis-je effacer mon vertex et index des listes, je puis disposer de ma Basiceffect et mon Graphicsdevicemanager, je téléphone alors à disposer sur le "jeu" lui-même et enfin je fais la variable qui contient le "jeu" est égale à null.
PS. Si vous avez déjà fait cela dans le XNA, alors vous pourriez aussi être en mesure de m'aider parce que la syntaxe de base est le même.
MODIFIER (Peut-être MonoGame bug):
J'ai maintenant réussi à nettoyer tous les tampons etc. correctement. Il y a encore une fuite de mémoire sur mon BasicEffect bien. J'ai essayé de le disposer et de le rendre nul, mais peu importe ce qu'il ne cesse de l'aide de plus en plus de mémoire à chaque fois que je recharge mon pivot.
- Si vous êtes à la liquidation de l'ensemble de la
IDisposable
ressources ne puisGC.Collect
pas de travail? - Je l'appelle mais il ne sait pas semblent avoir un effet
- êtes-vous sûr de l'élimination de toutes les connexions et éléments? pouvez-vous partager votre code?
- Bon alors voir la Force de garbage collection de tableaux, C#. Vous avez probablement besoin de préallouer les gros morceaux de mémoire pour aider à la GC optimiser le tas d'objets volumineux.
- Il est possible que quelque chose d'interne à MonoGame est accroché à la mémoire. Vous pouvez exécuter un profileur de mémoire au-dessus de votre code de le trouver? En particulier, les références statiques peuvent souvent être la racine du mal. Jetez un oeil à la mise en œuvre de la classe de Jeu, il a une statique interne référence à lui-même. github.com/mono/MonoGame/blob/develop/MonoGame.Framework/...
- Il pourrait même être plus simple et sérieux bug dans MonoGame - il pourrait simplement être une fuite des ressources non managées (pas la mise en œuvre de
IDisposable
et un finaliseur correctement). Ne serait pas une surprise pour moi. - Comme mentionné dans mon edit pour problème semble être avec BasicEffect parce que si je ne l'utilise pas ma mémoire n'a pas de fuite. J'ai regardé le code pour BasicEffect et il semble qu'il n'y a pas de mise en œuvre pour les Éliminer, devrait-il en être ainsi?
- Vous devriez probablement vous informer de ce bug à l'MonoGame équipe et lier de nouveau à cette question pour référence.
Vous devez vous connecter pour publier un commentaire.
utilisation garbage collector et attendre pour la finaliser.
D'abord, vous devez définir la valeur null si il n'est plus en usage:
Ensuite, vous pouvez Activer le garbage collector:
Si elle ne dispose pas que ce soit le XamlGame objet n'est pas null ou une référence à elle est toujours détenue par un autre objet.
Garder à l'esprit que si XamlGame est l'héritage de l' Jeu classe, vous ne serez pas en mesure d'en disposer comme il contient de l'exécution de la boucle qui maintient l'ensemble de l'application de jeu vivant. Si vous avez aliéné la demande de crash et de se terminer.
Apparemment MonoGame simplement ne supporte pas d'être créé plus d'une fois dans un jeu et une fuite de mémoire si cette opération est effectuée. Un peu plus compliqué, c'est de n'utiliser qu'un seul jeu et de changer le panneau qu'il est en train de.