2013-07-07 31 views
6

Ho un'applicazione C# che consiste in un pivot con più Pivotitems. I normali Pivotitems si scaricano correttamente e non perdono memoria. Su due degli elementi, però, ho Drawingsurfaces su cui utilizzo Monogame per il rendering di modelli 3d. Durante lo scarico e il caricamento dei loro perni sto cercando di distruggere completamente e quindi ricreare completamente le istanze di "Gioco" (principalmente perché Monogame non ti permette di disegnare su due superfici al momento e perché usano molta memoria e c'è non abbastanza per entrambi).C# Come rimuovere completamente l'oggetto dalla memoria

Il mio problema è che quando dispongo di Xamlgame che viene creato al momento del caricamento non rilascia tutta la memoria utilizzata. Ciò significa che ogni volta che ricreo Xamlgame inizia a utilizzare sempre più memoria finché non ne rimane più. Pertanto, vorrei sapere se esiste un modo C# per smaltire completamente tutta la memoria che è stata utilizzata al momento del caricamento di un oggetto.

Anche qualsiasi modo specifico per Monogame sarà apprezzato. Al momento sono il primo a gettare il mio vertice e il buffer dell'indice, poi svuoto il mio vertice e le mie liste indice, poi dispongo il mio Basiceffect e il mio Graphicsdevicemanager, quindi chiamo dispose sul "gioco" stesso e infine faccio la variabile che contiene il "gioco" uguale a null.

PS. Se lo hai mai fatto in XNA, potresti anche essere in grado di aiutarmi perché la sintassi è fondamentalmente la stessa.

EDIT (potrebbe essere MonoGame bug):

ora ho riuscito a pulire tutti i buffer ecc correttamente. C'è ancora una perdita di memoria sul mio BasicEffect però. Ho provato a eliminarlo e renderlo nullo, ma non importa cosa continua a utilizzare sempre più memoria ogni volta che ricarico il mio perno.

+0

Se si eliminano tutte le risorse 'IDisposable', allora [' GC.Collect'] (http://msdn.microsoft.com/en-us/library/System.GC.Collect.aspx) non lavoro? – Romoku

+0

Lo chiamo ma non sembra avere un effetto – Gerharddc

+0

sei sicuro di disporre tutte le connessioni e gli articoli? puoi condividere il tuo codice? –

risposta

-2

Apparentemente MonoGame semplicemente non supporta la creazione di più di una volta in un gioco e perde memoria se questa operazione viene eseguita. Il più complicato è usare una sola istanza di gioco e cambiare il pannello a cui sta disegnando.

6

utilizzare Garbage Collector e attendere per finalizzare.

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

In primo luogo è necessario impostare il valore a null in modo che non è più in uso:

XamlGame = null 

Poi si può attivare il garbage collector:

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

Se non dispone di quanto l'oggetto XamlGame non sia nullo o un riferimento ad esso sia ancora trattenuto da un altro oggetto.

Tenere presente che se XamlGame eredita dalla classe Game non sarà possibile eliminarlo poiché contiene il ciclo di esecuzione in esecuzione che mantiene attiva l'intera applicazione di gioco. Se lo smaltissi, l'applicazione si arresterebbe e si arresterebbe.