2013-07-07 13 views
6

Mam aplikacji C# składają się z wielu Pivotitems Pivot. Normalne Pivotitemy rozładowują się prawidłowo i nie przeciekają pamięci. Na dwóch przedmiotach mam jednak rysunki, na których używam Monogame do renderowania modeli 3D. Po rozładowaniu i załadowaniu ich czopów próbuję całkowicie zniszczyć, a następnie całkowicie odtworzyć instancje "Gry" (głównie dlatego, że Monogame nie pozwala na narysowanie w tym momencie na dwóch powierzchniach i ponieważ używają dużo pamięci i istnieje za mało dla nich obu).C# Jak całkowicie usunąć obiekt z pamięci

Mój problem jest, że kiedy wyrzucać Xamlgame który jest tworzony po załadowaniu go nie zwalnia całą pamięć jest używana. Oznacza to, że za każdym razem, gdy odtwarzam Xamlgame, po prostu zaczyna korzystać z coraz większej ilości pamięci, dopóki nie pozostanie więcej. Dlatego chciałbym wiedzieć, czy istnieje jakikolwiek sposób C#, aby całkowicie pozbyć się całej pamięci, która została użyta przy ładowaniu obiektu.

Wszelkie Monogame specyficzny sposób będzie również mile widziane. W tej chwili najpierw pozbywam się bufora wierzchołków i indeksu, potem wyczyściam swoje listy wierzchołków i indeksów, potem pozbywam się mojego Basiceffect i mojego urządzenia do generowania grafiki, potem nazywam dispose samą "grą" i na koniec robię zmienną, która zawiera "grę" równą zeru.

PS. Jeśli kiedykolwiek robiłeś to w XNA, możesz również być w stanie mi pomóc, ponieważ składnia jest w zasadzie taka sama.

EDIT (może być MonoGame bug):

Mam teraz udało się wyczyścić wszystkie bufory itp poprawnie. Na moim BasicEffect nadal występuje przeciek pamięci. Próbowałem go unieszkodliwić i unieważnić, ale bez względu na to, po co ciągle zużywa coraz więcej pamięci za każdym razem, gdy ponownie ładuję swój pivot.

+0

Jeśli utylizacji wszystkich 'IDisposable' zasobów następnie robi [' GC.Collect'] (http://msdn.microsoft.com/en-us/library/System.GC.Collect.aspx) nie praca? – Romoku

+0

Dzwonię, ale wydaje się, że nie ma to żadnego skutku. – Gerharddc

+0

czy jesteś pewien, że pozbywasz się wszystkich połączeń i przedmiotów? czy możesz udostępnić swój kod? –

Odpowiedz

-2

Widocznie MonoGame po prostu nie obsługuje powstaje więcej niż raz w grze i będzie przeciekać pamięci, jeśli ta operacja jest wykonywana. Bardziej skomplikowane jest użycie tylko jednej instancji gry i zmiana panelu, który rysuje.

6

wykorzystanie śmieci kolektor i poczekać do jej sfinalizowania.

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

Najpierw trzeba ustawić wartość null, więc nie jest już w użytku:

XamlGame = null 

Następnie można aktywować śmieciarza:

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

jeśli to nie wyrzuca, ponieważ obiekt XamlGame nie ma wartości null lub odniesienie do niego nadal jest zatrzymywane przez inny obiekt.

Należy pamiętać, że jeśli XamlGame dziedziczy z gier klasy nie będą mogli zbyć go, gdyż zawierają systemem wykonywania pętli, która utrzymuje całą aplikacja gra żyje. Jeśli go usuniesz, aplikacja zawiesi się i zakończy.

Powiązane problemy