7

複数の Pivotitem を持つ Pivot で構成される C# アプリケーションがあります。通常の Pivotitem は適切にアンロードされ、メモリ リークは発生しません。ただし、そのうちの 2 点については、Monogame を使用して 3D モデルをレンダリングする Drawingsurfaces があります。ピボットのアンロードとロード時に、「ゲーム」インスタンスを完全に破棄してから完全に再作成しようとしています (主に、Monogame では現時点で 2 つのサーフェスへの描画が許可されておらず、それらが多くのメモリを使用し、どちらも足りない)。

私の問題は、ロード時に作成された Xamlgame を破棄しても、使用したすべてのメモリが解放されないということです。これは、Xamlgame を再作成するたびに、残りがなくなるまで、ますます多くのメモリを使用し始めることを意味します。したがって、オブジェクトのロード時に使用されたすべてのメモリを完全に破棄する C# の方法があるかどうかを知りたいです。

モノゲーム固有の方法も評価されます。現時点では、最初に頂点とインデックス バッファーを破棄し、次に頂点とインデックス リストをクリアします。次に、Basiceffect と Graphicsdevicemanager を破棄します。次に、「ゲーム」自体で dispose を呼び出し、最後に変数を作成します。 null に等しい「ゲーム」が含まれます。

PS。XNA でこれを行ったことがある場合は、構文が基本的に同じであるため、私を助けることができるかもしれません。

編集(モノゲームのバグかもしれません):

すべてのバッファなどを適切にクリーンアップすることができました。ただし、私の BasicEffect にはまだメモリ リークがあります。私はそれを破棄してnullにしようとしましたが、ピボットをリロードするたびにメモリをどんどん使い続けています。

4

3 に答える 3

8

まず、値を null に設定して、使用されないようにする必要があります。

 XamlGame = null

次に、ガベージ コレクターを有効にできます。

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

破棄しない場合は、XamlGame オブジェクトが null でないか、そのオブジェクトへの参照がまだ別のオブジェクトによって保持されています。

XamlGame がGameクラスから継承している場合、ゲーム アプリケーション全体を維持する実行中の実行ループが含まれているため、破棄できないことに注意してください。破棄すると、アプリケーションがクラッシュして終了します。

于 2013-07-22T13:58:14.973 に答える
7

ガベージコレクターを使用して、ファイナライズするのを待ちます。

            GC.Collect();
            GC.WaitForPendingFinalizers();
于 2013-07-09T18:53:08.967 に答える
-3

どうやら、MonoGame はゲーム内での複数回の作成をサポートしていないようで、この操作が実行されるとメモリ リークが発生します。やや複雑なのは、ゲーム インスタンスを 1 つだけ使用し、描画先のパネルを変更することです。

于 2013-08-08T04:20:57.933 に答える