1

私は最近、ゲーム エンジンにエンティティ コンポーネント システムを実装しています。すべてのエンティティは、次のようなコンポーネントのマップを保持します。

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 つだけでなく、多くのコンポーネントが存在する可能性があります。これらはテスト目的でのみ記述しました。

4

3 に答える 3

2

の最大数COMPONENT_INFOが固定されているので、array<Component*>(orvector<>と、egmyArray[COMPONENT_INFO::COMPONENT_PHYSICS]をアドレス指定に使用できます。ただし、nullptr を確認する必要がある場合があります。

于 2013-07-29T09:51:37.463 に答える