これは「難しい」質問です。Web 上で興味深いものは何も見つかりませんでした。
会社でメモリ管理モジュールを開発しています。次世代コンソール (Xbox 360、PS3、PC... PC をコンソールと見なしています) 向けのゲームを開発しています。
将来、次のゲームでは、メイン コンソール メモリにすべてをロードすることができない大規模なゲーム ワールドのテクスチャ ストリーミングを処理する必要があります (今のところ PC については話していません)。
最初に、テクスチャの高解像度ミップマップ (ワールド データのサイズの約 70%) をストリーミングします。将来的には、ジオメトリ、小さなミップマップ、オーディオなどもストリーミングする必要があるかもしれません.
X360に焦点を当てた、その問題のためのメモリマネージャーを開発しています(PS3を介してホストメモリと関連する自動最適化GMMアロケーターを使用できるため)。
私が直面している問題は次のとおりです。テクスチャ ストリーミング用に特定のメモリ領域 (たとえば 64 メガバイト) を予約することに決め、その領域内のすべての割り当てと割り当て解除を処理したいと考えています。アプリケーションの開始時に領域を割り当てており、その領域は物理的に連続していることが保証されています (仮想だけでなく、そこにテクスチャを格納する必要があるため)。
ポインターの代わりにハンドルを使用して、自動最適化アロケーターを実装しました。時間は問題ではありません。問題はメモリの断片化です。ゲームでは、ストリーミング ターゲットを継続的にロードおよびアンロードするため、バッファーの最大量 (64 メガバイト) を使用したいと考えています。
このアロケーターを使用すると、割り当てられたスペースをすべて使用できますが、最適化ルーチンは許容できない時間 (フレームよりも長い 60 ミリ秒) で動作しますが、アルゴリズムはそれほど悪くはありません... 避けられない memcpy が多すぎます!
この問題を解決するソリューションを探しています。少なくとも良い論文、または事後分析、または私と同じ問題に直面した人を見つけたいと思います.
今、私は 2 つの戦略から選択しています: 1) 最適化ルーチンを専用スレッドに移動します (6 つの hw スレッドを使用する X360 には適していますが、ハードウェア スレッドのみを使用する PS3 には適していません... SPU を使用するように言わないでください!)領域のロック、移動中の領域へのアクセスなど、すべてのマルチスレッドの問題について...メモリ マネージャーは、フレームごとに予算内で実行できることを実行します。
誰かが彼の経験を教えてもらえますか?