.NET CF 3.5 ネットワーク ゲームを開発しています。私の問題は、アプリが最初のインスタンスですべてのリソースをロードすることです。ただし、その後の起動時に、リソース、特にサウンドや大きな画像をロードしているときに、アプリは例外からメモリを取得します。
ガイドしてください
.NET CF 3.5 ネットワーク ゲームを開発しています。私の問題は、アプリが最初のインスタンスですべてのリソースをロードすることです。ただし、その後の起動時に、リソース、特にサウンドや大きな画像をロードしているときに、アプリは例外からメモリを取得します。
ガイドしてください
一度にゲームの複数のインスタンスをネギしようとしていないと思います。これは、ゲームのシャットダウン後にメモリがOSに戻されていないようです。リークがあるかどうかを判断する簡単な方法の1つは、次のとおりです。
メモリが不足する前にいくつかの起動を取得できる場合は、小さなリークがあります。デバイスを再起動する前に一度しか起動できない場合は、大きなものがあります。ガベージコレクションはこれまでのところしか行われません。アンマネージコードを呼び出す場合(アンマネージオブジェクトをインスタンス化するWin32またはPInvoke呼び出し)、ゲームのシャットダウン時にこれらのリソースを解放する必要があります。
Microsoft provides us with the CLR Profiler, a tool for analyzing the behavior of your managed application, which you can download here. It is CLR Profiler for .NET 2.0 but it will work with .NET 3.5 because CLR has not been changed.
おそらく問題の一部は、.NET CF が Windows CE のメモリ モデルをうまく処理できないことです。(大規模なメモリ割り当ては、それが利用可能であっても OutOfMemory 例外で失敗します。物事が壊れ始める魔法の数はわかりません...)
詳細の一部を次に示します。 .Net Compact Framework の高度なメモリ管理
これを回避する最も簡単な方法は、RAM ディスク (例: \temp) にコピーすることです。プラン B は、何かリンク Marshal.AllocHGlobal または P/Invoke VirtualAlloc (怖い!) を GCHandle.Pin と共に使用することです。
.NET CF を使用したプログラミングの経験に基づくと、メモリの制約にさらされており、ガベージ コレクションは通常のデスクトップ/PC 環境で期待されるものではありません。
私のアプリケーションでは、オブジェクトがスコープ外になる前に常に Close() メソッドと Dispose() メソッドを呼び出すことで、メモリ不足の例外で直面していた問題を解決しました。
それでも問題が解決しない場合は、アプリケーションを閉じるイベント ハンドラーにフックして GC.Collect() を呼び出すという方法もあります。これにより、ガベージ コレクターは、未使用または破棄されたすべてのオブジェクトを即座に収集するように強制されます。
すべてのリソースをロードした後、アプリケーションはどのくらいのメモリを消費しますか? デフォルト設定では、このエラーが cca 1.3 GB のプライベート バイトを超えて発生しています (タスク マネージャーとプロセスのメモリ割り当てを確認しています)。