作成できるビットマップ スペースの合計サイズを制限するデバイス制限に遭遇したように見えるので (これらは一般的なプログラム メモリではなくビデオ RAM で作成されるようです)、ここで使用されている大きな Bitmap オブジェクトをBitBlt API 関数を PInvoking することにより、読み取りと書き込みのためにアクセスする Windows メモリのプレーンな古いブロック。
最初にメモリブロックを作成するのは難しいので、おそらくそれについて別の SO の質問をしたいでしょう (GCHandle.Alloc をここで使用して、「固定された」オブジェクトを作成できます。つまり、.NET はそれを移動することができません)ここで重要なメモリ)。私はそれを行う方法を知っていますが、それを正しく行うかどうか確信が持てず、むしろ専門家の意見が欲しいです.
大きなブロックを作成したら、アイテムを反復処理し、それぞれを (既存の .NET コードを使用して) 再利用し続ける 1 つの小さなビットマップにレンダリングし、それをメモリ ブロックの適切な場所に BitBlt します。
キャッシュ全体を作成した後、レンダリング コードは以前と同じように機能するはずですが、大きなビットマップからレンダリング サーフェスにコピーする代わりに、キャッシュ ブロックから BitBlt を実行するという違いがあります。BitBlt の引数は基本的に DrawImage と同じです (宛先、ソース、座標、サイズなど)。
専用のビデオ RAM ではなく、この方法で通常のメモリからキャッシュを作成しているため、同じ問題に遭遇することはないと思います。ただし、ブロック作成コードを最初に動作させ、毎回十分な大きさのブロックを作成できることを確認するためにテストします。
更新: 実際には、理想的なアプローチは、1 つの大きなメモリ ブロックではなく、小さなメモリ ブロックのコレクションを持つことです (ビットマップ アプローチの問題だと思っていたように)。私は 5 MB および 10 MB のオブジェクトを処理する CF アプリを使用してきましたが、とにかく大きな問題ではありません (ただし、そのチャンクが固定されている場合はより大きな問題になる可能性がありますが、わかりません)。ところで、ビットマップが利用可能なメモリよりもはるかに小さいことを知っていたので、ビットマップ作成の OOME にはいつも驚かされていました。その理由がわかりました。申し訳ありませんが、これは最初は簡単な解決策だと思っていました。