私は最近、ゲーム エンジンにエンティティ コンポーネント システムを実装しています。すべてのエンティティは、次のようなコンポーネントのマップを保持します。
Component.h
enum COMPONENT_INFO {
COMPONENT_POSITION = 0,
COMPONENT_PHYSICS,
COMPONENT_RENDERABLE
};
Entity.h
class Entity {
public:
std::bitset<NUM_COMPONENTS> componentBits;
std::map<COMPONENT_INFO, Component*> components;
..
..
Component *getComponent(COMPONENT_INFO inf) {
return components[inf];
}
};
そして、私の System クラスは、そのようにフレームごとにすべてのエンティティを更新します:
void update(Entity *e, float delta) {
PositionComponent *cmp=(PositionComponent*)e->getComponent(COMPONENT_INFO::COMPONENT_PHYSICS);
//x += 1.0f;
cmp->x += 1.0f;
}
すべてが意図したとおりに機能しますが、マップへのアクセスに大きなパフォーマンスの問題があります。10000 個のエンティティを作成してそれらを反復処理すると (システムは実際に反復処理を実行します)、青い空のシステム (視覚効果なし、プレーンな画面のみ) で 80 FPS が得られます。しかし、アクセス部分をコメントアウトして のみを使用するx += 1.0f;
と、FPS が 1000 まで信じられないほど増加します。
void update(Entity *e, float delta) {
x += 1.0f; //btw the system has a local x value.
}
したがって、問題は単にマップを介してコンポーネントにアクセスすることです。そのようなシステムで他に何が使用できますか? それとも、マップへのアクセスで何か間違っているのでしょうか?
重要な編集: これは単なるテスト ドライブです。つまり、エンティティごとに 3 つだけでなく、多くのコンポーネントが存在する可能性があります。これらはテスト目的でのみ記述しました。