そこで、C++ について質問があります。ゲームの敵クラスがあるとしましょう。ゲーム内に (理論上) 無限の数の敵を配置できるようにしたいと考えています。そのため、各クラスのインスタンスを複数持つ必要があり、これらに個別にアクセスできる必要があります。配列用に無制限のスペースを持つ敵オブジェクトの配列を用意する必要がありますか? new および delete 演算子を使用して、配列内の敵を作成および削除しますか? それなら、敵の数を保持する変数が必要ですよね?
7 に答える
を使用しstd::vector
ます。必要に応じて、より多くのメモリが自動的に割り当てられます。
std::list
標準ライブラリには、必要に応じてメモリを自動的に割り当てる他のコンテナもありstd::set
ますstd::map
。これらのコンテナーは、特別な場合に適している場合がありますstd::vector
が、通常は最適な選択です。それはすべて実装の詳細に依存します。
次のように使用できます。
#include <vector>
struct Enemy {
//...
}
std::vector<Enemy> v;
Enemy e1, e2;
v.push_back(e1);
v.push_back(e2);
std::cout << "First enemy in vector: " << v[0];
おそらく、標準ライブラリのコンテナを使用したいと思うでしょう。最良のスタートは、おそらく標準ライブラリのvectorでしょう。これは配列に似ていますが、追加するアイテムの数に基づいて拡張されます。そうすれば、スペースを無駄にしません。
特定の要件に応じて、異なるパフォーマンス特性を持つ他のコンテナーがあります。しかし、ベクトルは通常非常に良い出発点です。これは、標準コンテナを選択するための非常に優れたリファレンスです。
C++ では、std::vector<>
動的にサイズ変更可能な配列のデータ構造です。私は敵のベクトルから始めます。
class Enemy { ... };
std::vector< Enemy > enemyCollection;
vector
データ構造がメモリ管理を処理します。参照については、 http://www.cplusplus.com/reference/vector/vector/を参照してください。
そのため、C++ にはコンテナーがあります: vector、list、deque、およびさらに多くの特殊化されたコンテナー (例: map、連想コンテナー)。
必要に応じて伸縮でき、アイテムを簡単に追加および削除できます。どちらを使用するかは、正確なニーズ (検索の複雑さ、ランダム アクセス、挿入の複雑さなど) によって異なります。
他の人が述べたように、標準的なコンテナーに慣れていない場合は、ベクトルから始めるのがおそらく良いでしょう。時間の経過とともに、適切なジョブに適切なコンテナーを選択する方法を学習します。
配列用に無制限のスペースを持つ敵オブジェクトの配列が必要ですか?
それはおそらく悪い考えだと思います。これらの「敵」の設計と性質によっては、すべての敵のすべてのデータを常にメモリに保持する必要がない場合があります。メモリが不足すると、ゲームはどうなりますか?
すべての敵オブジェクトは本当に完全なオブジェクトである必要がありますか? Flyweight 設計パターンを見てみましょう。一度にすべてを揃える必要はないと思います。
単一の敵に文字通り対応する敵クラスのインスタンスの概念は、間違った方向に進んでいる可能性があります。
他の潜在的なパターンには、プロキシとプロトタイプが含まれます。
new および delete 演算子を使用して、配列内の敵を作成および削除しますか?
実装によって異なります。malloc/new の場合は、解放/削除する必要があります。これは些細なことであり、オブジェクトを入れたコンテナーとは関係ありませんが、代わりに作成プロセスに依存しています。
ゲーム中に常に malloc/new を呼び出して敵を作成する必要がある場合、ゲームのパフォーマンスが低下することを覚えておいてください。一度に 1 つのスレッドにしか許可されない OS へのシステム コールに向かうたびに、異なるスレッドで一度に大量の呼び出しが発生すると、問題になる場合と問題にならない場合がある多くの遅延が発生します。文脈を与えて、これは今のところあなたにとって重要ではないと仮定しますが、他の人のためにとにかくそれについて言及しました. 大まかにどれだけのメモリが必要になるかを把握し、事前に必要なすべてのメモリを取得し、不足した場合は 2 倍の量を要求することをお勧めします....しかし、これはメモリ管理に関するまったく別のトピックです...これは、データ構造と構築パラダイムとはほとんど関係ありません。
それなら敵の数を保持する変数が必要ですよね?
保管方法によって異なります。c-array を使用している場合は、自分で管理しています。ほとんどの正式なコンテナーには、サイズを取得するためのかなり効率的な方法があります。しかし、その間に注意点があるかもしれません。
しかし、あなたがこの質問をしているとしたら、実装の詳細やコード行から離れて、考え抜かれたり理解されていないように見える、より高いレベルのアーキテクチャをまとめたりする必要があると思います。「終わりを考えて始める」
あなたの質問に対して、現在の形で有意義な方法で明確に答えることは誰にもできません。あなたの本当の質問は次のようです:
- コンテナーとは何ですか? また、どのように機能しますか?
- これらの大規模な敵のコレクションを管理するための効率的なパラダイムは何ですか (Gang of Four の Design Patterns から FlyWeight を真剣に調べてください)。
- データ構造を構築するにはどうすればよいですか?
1 について: このサイトには、データ構造に関する多くの質問/回答があり、無数の既存のデータ構造に関する書籍やドキュメントがたくさんあります。Boost と同様に、STL は数十を提供します。ここでそれを再ハッシュするつもりはありません。
2について。私が言ったように、この問題を解決するにはよく知られているパターンを見る必要があります。上記でいくつかの提案をしました。これ以上の情報がなければ、これは私が提供できる最も一般的に有用な情報であり、他の誰かに役立つ可能性があります.
3.に関しては、メモリ割り当ての処理が失敗してインスタンス化できなくなってコードを散らかす必要がないように、個別のアイテムを主張する場合は、おそらくファクトリメソッドまたは抽象ファクトリなどを検討する必要があると思います敵。
std::vector; を使用するだけです。これは無限境界を持つ動的配列です。