2013-07-07 9 views
6

Ich habe eine C# -Anwendung, bestehend aus einem Pivot mit mehreren Pivotitems. Die normalen Pivotitems werden ordnungsgemäß entladen und verlieren keinen Speicher. Bei zwei der Objekte habe ich jedoch Zeichnungsoberflächen, auf denen ich Monogame zum Rendern von 3D-Modellen verwende. Nach dem Entladen und Laden ihrer Pivots versuche ich die "Game" - Instanzen komplett zu zerstören und dann komplett neu zu erstellen (hauptsächlich, weil Monogame es momentan nicht erlaubt auf zwei Flächen zu zeichnen und weil sie viel Speicher benutzen und es gibt nicht genug für beide).C# Wie Objekt vollständig aus dem Speicher entfernen

Mein Problem kommt in, wenn ich das Xamlgame entsorgen, das beim Laden erstellt wird, gibt es nicht den gesamten Speicher frei, den es verwendete. Das bedeutet, dass ich jedes Mal, wenn ich das Xamlgame neu erstellt habe, mehr und mehr Speicher verwende, bis nichts mehr übrig ist. Daher würde ich gerne wissen, ob es einen Weg gibt, den gesamten Speicher, der beim Laden eines Objekts verwendet wurde, vollständig zu beseitigen.

Jede Monogame spezifische Art würde auch geschätzt werden. Im Moment entsorge ich zunächst meinen Vertex- und Indexpuffer, dann räume ich meine Vertex- und Indexlisten auf, entsorge dann meinen Basiseffekt und meinen Graphicsdevicemanager, dann rufe ich das "Spiel" selbst auf und schließlich mache ich die Variable das enthält das "Spiel" gleich null.

PS. Wenn Sie das jemals in XNA getan haben, können Sie mir vielleicht auch helfen, weil die Syntax im Grunde die gleiche ist.

EDIT (Might monogame bug):

Ich habe jetzt reinigen alle Puffer etc. bis ordnungsgemäß verwaltet. Auf meinem BasicEffect ist jedoch immer noch ein Speicherleck vorhanden. Ich habe versucht, es zu entsortieren und es null zu machen, aber egal, was es immer mehr und mehr Speicher verwendet, jedes Mal wenn ich meinen Drehpunkt neu lade.

+0

Wenn Sie alle 'IDisposable' Ressourcen entsorgen, dann tut ['GC.Collect'] (http://msdn.microsoft.com/en-us/library/System.GC.Collect.aspx) nicht Arbeit? – Romoku

+0

Ich rufe es, aber es scheint keine Wirkung zu haben – Gerharddc

+0

Sind Sie sicher, dass Sie alle Verbindungen und Gegenstände entsorgen? kannst du deinen Code teilen? –

Antwort

-2

Offensichtlich unterstützt MonoGame einfach nicht mehr als einmal in einem Spiel erstellt und Speicher verloren, wenn dieser Vorgang ausgeführt wird. Etwas komplizierter ist es, nur eine Spielinstanz zu verwenden und das zu zeichnende Panel zu ändern.

6

Verwenden Sie Garbage Collector und warten Sie, um es abzuschließen.

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

Zunächst werden Sie den Wert festlegen müssen auf null, so ist es nicht mehr in Gebrauch:

XamlGame = null 

Dann können Sie den Garbage Collector aktivieren:

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

Wenn es nicht verfügbar, wenn entweder das XamlGame-Objekt nicht null ist oder eine Referenz darauf noch von einem anderen Objekt gehalten wird.

Bedenken Sie, dass, wenn XamlGame von der Klasse Game erbt, Sie es nicht entsorgen können, da es die laufende Ausführungsschleife enthält, die die gesamte Spielanwendung am Leben erhält. Wenn Sie es entsorgten, würde die Anwendung abstürzen und beenden.