C# で記述されたビデオ アプリケーションを維持しています。大きなメモリ バッファ (数百メガバイト) のメモリ割り当て/割り当て解除を可能な限り制御する必要があります。
書き込まれると、ピクセル データを解放する必要がある場合、ピクセル バッファーは null に設定されます。メモリを解放するより良い方法はありますか? 大きなオブジェクトのガベージ コレクションには大きなコストがかかりますか?
ありがとう!
C# で記述されたビデオ アプリケーションを維持しています。大きなメモリ バッファ (数百メガバイト) のメモリ割り当て/割り当て解除を可能な限り制御する必要があります。
書き込まれると、ピクセル データを解放する必要がある場合、ピクセル バッファーは null に設定されます。メモリを解放するより良い方法はありますか? 大きなオブジェクトのガベージ コレクションには大きなコストがかかりますか?
ありがとう!
そのような大きなバッファーを捨てないでください。それを持っているのは幸運です。ビデオは、再利用の機会をたくさん与えてくれます。もう必要ないと確信できるまで、バッファを失わないでください。その時点で、いつ収集されるかは問題ではありません。
非常に大きなメモリブロック(「数百メガバイト」)を使用すると、誰がどこでそれらを使用しているかを比較的簡単に知ることができます(とにかく、このようなブロックの10〜20個だけをメモリに収めることができます)。ypuはこのような量のmmeoryを使用することを計画しているため、メモリ使用量の予算を慎重に立てる必要があります。つまり、バッファ全体の単純なコピーには重要な時間がかかります。
特定のブロックを使い終わったら、GCを自分で強制することができます。GC.CollectAPIの合理的な使用法のように聞こえます-使用可能なすべてのメモリの大部分を使用して完了しました。
また、アプリケーションで機能する場合は、より小さな(64k)ブロックの割り当てに切り替えて、それらをリンクすることも検討してください。これにより、ガベージコレクションとの整合性が向上し、アプリケーションの柔軟性が向上する可能性があります。
私が覚えている限り、大きなオブジェクトをガベージ コレクションするコストは非常に高くなります。私が読んだことから、それらは割り当て時に自動的に第2世代になります(大きなオブジェクトヒープに割り当てられます)。また、サイズが大きいため、ジェネレーション 2 のコレクションが頻繁に発生します。
したがって、ビットマップ配列の手動プーリングを実装するか、アンマネージ メモリを使用することもできます。Dispose
いくつかのプール クラスを用意し、配列をピクセル/ビットマップ クラスに戻します。