В C# Как удалить объект из памяти

У меня есть приложение c#, состоящее из Pivot с несколькими Pivotitems. Нормальные Pivotitems разгружают правильно и не пропускают память. Однако на двух элементах у меня есть Drawingsurfaces, на которых я использую моногамию для рендеринга 3d-моделей. При выгрузке и загрузке их шарниров я пытаюсь полностью уничтожить, а затем полностью воссоздать экземпляры "игры "(в основном потому, что моногамия не позволяет рисовать на двух поверхностях в данный момент и потому, что они используют много памяти и их не хватит на двоих).

моя проблема заключается в том, что когда я размещаю Xamlgame, который создается при загрузке, он не освобождает всю используемую память. Это означает, что каждый раз, когда я воссоздаю Xamlgame, он просто начинает использовать все больше и больше памяти, пока больше не останется. Поэтому я хотел бы знать, есть ли способ c# полностью избавиться от всей памяти, которая была использована при загрузке объекта.

любой конкретный способ моногамии также оцените. В данный момент я сначала избавляюсь от буфера вершин и индексов, затем очищаю списки вершин и индексов, затем избавляюсь от Basiceffect и Graphicsdevicemanager, затем вызываю dispose в самой "игре" и, наконец, делаю переменную, содержащую "игру", равной null.

PS. Если вы когда-либо делали это в XNA, вы также можете помочь мне, потому что синтаксис в основном тот же.

EDIT (может быть моногамным bug):

теперь мне удалось очистить все буферы и т. д. правильно. Есть еще утечки памяти в моем BasicEffect. Я попытался избавиться от него и сделать его нулевым, но независимо от того, что он просто продолжает использовать все больше и больше памяти каждый раз, когда я перезагружаю свой pivot.

3 ответов


используйте сборщик мусора и дождитесь его завершения.

            GC.Collect();
            GC.WaitForPendingFinalizers();

сначала вам нужно установить значение null, чтобы он больше не использовался:

 XamlGame = null

затем вы можете активировать сборщик мусора:

 GC.Collect();
 GC.WaitForPendingFinalizers();

если он не dispose, чем либо объект XamlGame не null или ссылка на него все еще удерживается другим объектом.

имейте в виду, что если XamlGame наследуется от - игры class вы не сможете его утилизировать, поскольку он содержит запущенный цикл выполнения, который сохраняет все игровое приложение живое. Если вы его утилизируете, приложение аварийно завершит работу.


по-видимому, MonoGame просто не поддерживает создание более одного раза в игре и будет пропускать память, если эта операция выполняется. Несколько сложнее использовать только один экземпляр игры и изменить панель, на которую он рисует.