15

私は最近、ゲーム プログラミングのために C++ に改宗しました。C# でメモリ管理とガベージ コレクションの問題を扱った経験は豊富ですが、C++ についてはそれほど多くはありません。

new過去に、ゲームプレイ中の割り当てと解放 (つまりとdelete) を回避し、必要になる可能性のあるすべてのものを前もって割り当てておくようにという漠然としたアドバイスを聞いたことがあります。しかし、これは、ゲームの実行中に必要に応じてゲーム オブジェクト (敵、パーティクルなど) を割り当てて解放するよりも、はるかに面倒でアーキテクチャ的に複雑です。

私が読んだアドバイスは、リソースに制約のあるプラットフォームに言及していたと思います。私は主に PC 向けに開発することを目指しており、頻繁に変更されるゲームの状態データはせいぜい数メガバイト程度になると思います。残りは、プリロードするテクスチャ、サウンド アセットなどです。

そこで私の質問は、ギガバイトのメモリを搭載した PC の世界で、ゲームの状態データ用に精巧なメモリ プールや事前割り当てなどを設定することは頭を悩ませる価値があるのでしょうか? それとも、限られたプラットフォームを最大限に活用する際に進化し、今では福音として繰り返されている、疑う余地のない「ベスト プラクティス」の伝統なのでしょうか?

私の 2 MB のゲーム データが断片化されて 4 MB に広がっているとしたら、1990 年以降に製造された PC ではそれが少しも問題になるとは考えられませんが、何か不足していないか知りたいです :)。

4

2 に答える 2

3

ギガバイトのメモリを搭載した PC の世界で

また、その PC で正常な OS が実行されている場合、プロセスに必要なメモリはわずか数メガバイトです。(しかし、それはとにかくここでの主要な問題ではありません。)

ゲーム ステート データ用に精巧なメモリ プール、事前割り当てなどを設定することは頭を悩ませる価値がありますか?

「常にすべてを事前に割り当てる」とはあえて言いません。それが不可能な場合もあり、使用頻度の低いオブジェクトの場合、努力する価値がないかもしれませんが、C および C++ での動的メモリ管理がリソースであることは確かです。集中的でゆっくり。したがって、たとえば、画面に 1 秒あたり 30 フレームをレンダリングする場合は、各フレーム/反復中にレンダリングされるオブジェクトのバッファーの割り当てと割り当て解除、および再割り当てを避けることができます。

于 2013-04-09T05:46:29.203 に答える