322

私はゲーム エンジンの設計 (特に 2D ゲーム エンジンに焦点を当てていますが、3D ゲームにも適用可能) に注目しており、その方法に関する情報に興味があります。最近では、多くのエンジンが、従来の深いオブジェクト階層ではなく、コンポーネント ベースの設計に移行していると聞きました。

これらの種類の設計がどのように実装されることが多いかについての情報への良いリンクを知っていますか? 私はあなたの階層を進化させたのを見てきましたが、詳細な情報をもっと多く見つけることはできません (ほとんどは「階層ではなくコンポーネントを使用する」と言っているようですが、考え方を変えるには少し努力が必要であることがわかりました) 2 つのモデルの間)。

これに関する優れたリンクや情報、さらには本をいただければ幸いです。ただし、ここでのリンクと詳細な回答が優先されます。

4

8 に答える 8

316

アップデート2013-01-07コンポーネントベースのゲームエンジンと(私の意見では)リアクティブプログラミングの優れたアプローチをうまく組み合わせたい場合は、V-Playエンジンをご覧ください。QTのQMLプロパティバインディング機能を非常にうまく統合しています。

私たちは大学でゲームのCBSEについて調査し、何年にもわたっていくつかの資料を収集しました。

ゲーム文学におけるCBSE:

  • ゲームエンジンアーキテクチャ
  • ゲームプログラミング宝石4:ゲームエンティティゲームを管理するためのシステム
  • ゲームプログラミングジェム5:コンポーネントベースのオブジェクト管理
  • ゲームプログラミングジェム5:ジェネリックコンポーネントライブラリ
  • ゲームプログラミング宝石6:ゲームオブジェクトコンポーネントシステム
  • オブジェクト指向ゲーム開発
  • Architektur des Kerns einer Game-Engine und Implementationierung mit Java(ドイツ語)

C#のコンポーネントベースのゲームエンジンの非常に優れたクリーンな例は、Elephantゲームフレームワークです。

どのコンポーネントが読み取られているかを本当に知りたい場合:コンポーネントベースのソフトウェアエンジニアリング!コンポーネントを次のように定義します。

ソフトウェアコンポーネントは、コンポーネントモデルに準拠するソフトウェア要素であり、構成標準に従って変更することなく、独立して展開および構成できます。

コンポーネントモデル は、特定の相互作用と構成の標準を定義します。コンポーネントモデルの実装は、モデルに準拠するコンポーネントの実行をサポートするために必要な実行可能ソフトウェア要素の専用セットです。

ソフトウェアコンポーネントインフラストラクチャは、これらのコンポーネントとインターフェイスを使用して構築されたソフトウェアシステムまたはサブシステムが明確に定義されたパフォーマンス仕様を満たすように設計された、相互作用するソフトウェアコンポーネントのセットです。

ゲームでCBSEを2年間経験した後の私の意見は、オブジェクト指向プログラミングは単なる行き止まりだということです。コンポーネントがどんどん小さくなり、無駄なオーバーヘッドがたくさんあるコンポーネントにパックされた関数のようになるのを見て、私の警告を覚えておいてください。代わりに関数型リアクティブプログラミングを使用してください。また、コンポーネントベースのゲームエンジンアーキテクチャからFRPに切り替えた理由についての私の新しいブログ投稿(執筆中にこの質問につながりました:))もご覧ください。

ゲームペーパーのCBSE:

ゲームのWebリンクのCBSE(関連性でソート):

于 2010-08-16T17:30:32.137 に答える
9

この件に関する情報が不足しているようです。私は最近、このシステムを実装しましたが、取り残されることが多い詳細を非常によく説明している、非常に優れた GDC パワーポイントを見つけました。そのドキュメントはこちら: Theory and Practice of Game Object Component Architecture

そのパワーポイントに加えて、いくつかの優れたリソースさまざまなブログがあります。PurplePwny には、適切な議論と他のリソースへのリンクがあります。Ugly Baby Studiosは、コンポーネントがどのように相互に作用するかというアイデアについて少し議論しています。幸運を!

于 2009-12-14T20:15:22.120 に答える
7

ゲーム エンジンの設計に関する完全なチュートリアルではありませんが、このページには、ゲームのコンポーネント アーキテクチャの使用に関する優れた詳細と例が含まれていることがわかりました。

于 2010-07-12T23:56:50.640 に答える
5

これはオープンソースであり、http://codeplex.com/elephantで入手できます。

gpg6 コードの実際の例を作成した人がいます。ここで見つけることができます: http://www.unseen-academy.de/componentSystem.html

またはここ: http://www.mcsaffry.com/GameCode/thread.php?threadid=732

よろしく

于 2010-04-02T13:25:23.747 に答える
4

私は現在、GameDev.net の多くの (多数の) スレッドでこの正確なトピックを調査しており、次の 2 つの解決策が、自分のゲームのために開発するものとして適切な候補であることがわかりました。

于 2010-07-17T12:39:09.193 に答える
4

私はゲーム開発コースのためにこの最後の学期を調査して実装しました。願わくば、このサンプル コードが、これにどのようにアプローチするかについて正しい方向性を示してくれることを願っています。

class Entity {
public:
    Entity(const unsigned int id, const std::string& enttype);
    ~Entity();

    //Component Interface
    const Component* GetComponent(const std::string& family) const;
    void SetComponent(Component* newComp);
    void RemoveComponent(const std::string& family);
    void ClearComponents();

    //Property Interface
    bool HasProperty(const std::string& propName) const;
    template<class T> T& GetPropertyDataPtr(const std::string& propName);
    template<class T> const T& GetPropertyDataPtr(const std::string& propName) const;

    //Entity Interface
    const unsigned int GetID() const;
    void Update(float dt);

private:
    void RemoveProperty(const std::string& propName);
    void ClearProperties();
    template<class T> void AddProperty(const std::string& propName);
    template<class T> Property<T>* GetProperty(const std::string& propName);
    template<class T> const Property<T>* GetProperty(const std::string& propName) const;

    unsigned int m_Id;
    std::map<const string, IProperty*> m_Properties;
    std::map<const string, Component*> m_Components;
};

コンポーネントは動作を指定し、プロパティを操作します。プロパティは参照によってすべてのコンポーネント間で共有され、無料で更新されます。これは、メッセージ パッシングの大きなオーバーヘッドがないことを意味します。質問があれば、できる限り答えようとします。

于 2010-09-05T22:59:46.903 に答える
1

このコンテキストでは、コンポーネントは、他のコンポーネントと同時に実行される可能性がある、エンジンの分離されたランタイム部分のように思えます。これが動機である場合は、それを利用するアクター モデルとシステムを検討することをお勧めします。

于 2009-12-14T14:41:17.713 に答える
1

興味深い記事...

Google で簡単に調べてみましたが、何も見つかりませんでしたが、いくつかのコメントを確認することをお勧めします。多くの人が単純なコンポーネントのデモを実装しようとしているようです。インスピレーションを得るための彼らの:

http://www.unseen-academy.de/componentSystem.html
http://www.mcshaffry.com/GameCode/thread.php?threadid=732
http://www.codeplex.com/Wikipage?ProjectName=elephant

また、コメント自体には、そのようなシステムをどのようにコーディングするかについて、かなり詳細な議論があるようです。

于 2009-12-14T14:53:32.130 に答える