5

私は C++ で効率的な「エンティティ システム」を作成しようとしています。多くの情報を得るために、インターネットで多くのブログ/記事/ドキュメントを読みましたが、またいくつか質問があります。

2 つの興味深いテーマを見つけました。

  • データ駆動型システム
  • エンティティ コンポーネント システム

私にとって、2 つのシステムは非常によく似ています。

したがって、Adam Smith によるこの例を見つけました: https://stackoverflow.com/a/2021868

次のような柔軟なシステムが必要です。

// Abstract class
class Component
{
     // data here
}

// exemple
class Car : public Component
{
    // Data here
}

// Entity with components
class Entity
{
   std::vector<Component*> components;
}

したがって、エンティティに次のコンポーネントがある場合: 車、変換、スプライト、 コンポーネント配列にはデータ駆動型システムのような線形データが含まれていましたか?

今、私はシステムを持っています:

class System 
{
     virtual void init();
     virtual void clear();
     virtual void update();

     std::unordered_map< const char*, Entity*> entities;
}

class RendererSystem : public System
{
    // Methods's definition (init, clear, …).

    void update()
    {
       for( entity, … )
       {
           Sprite* s = entity->getComponent('sprite');
           ...
       }
    }
}
  • 仮想関数が悪いと読んだことがありますが、その場合は悪いですか?
  • get コンポーネントには static_cast が必要です。それは悪いことですか?
  • データ駆動型システムでは、どこにでもポインターがありました。「元の」変数はどこにありますか?
  • 私はこれを正しくしましたか?

このすべてのポイントは、私の心の中で「ぼやけて」見えます。

4

1 に答える 1

1
  1. 仮想関数には多少のオーバーヘッドがありますが、毎秒数百万回の呼び出しを行っていない限り気にする必要はないので、その事実は無視してください。
  2. 静的キャスト自体は悪くありませんが、それが使用されている場所で静的型チェックを中断します。そのため、キャストするオブジェクト内で動作を移動できる場合は、特定のランタイム インスタンスを知らなくても適切なメソッドを呼び出すことができます。オブジェクトならそれでいい
  3. newデータ駆動型のアプローチで要素のベクトルを持っていても、コレクション内の各要素を(ポインターの場合)で割り当てる必要がある場合でも、何を求めているのかは明確ではありません。次に、一度割り当てたら、アイテムへの参照を渡すとすぐに再度行う必要はありません
于 2012-12-05T20:36:36.383 に答える