2

私はコンポーネント ベースのゲーム エンジンを作成しています。次の設計を使用して、可能な限りロジックからデータを分離しようとしています。

                                      Engine
              /                          |                                \
     EntityManager            ComponentManager                         SystemManager
(vector of entities)      (map of (entities - vector of components)) (vector of systems)

基本的に、これらすべてのマネージャーは、エンティティ、コンポーネント、およびシステムの所有者にすぎません。

これらの簡単な説明は次のとおりです。

エンティティ: ゲーム内のすべてのオブジェクト (および UUID) を表すクラス。

Component : (そのサブクラスが) Entity の特定のものに関するデータのみを ex として保持する抽象クラス。PositionComponent は、Entity の x、y 値のみを持ちます。

システム: (そのサブクラスが) エンティティに作用するすべてのロジックを持つ抽象クラス。PositionSystem は、エンジンによって渡された Process() メソッドに操作対象のエンティティを持ち、事前定義されたロジックを使用してコンポーネントの値を変更します。

私の問題は、オブジェクトにこのようなシナリオを伝えるにはどうすればよいですか? たとえば、システム (SystemManager に存在する) から ComponentManager にメッセージを送信して、システムが処理している現在のエンティティの特定のコンポーネントを取得するにはどうすればよいですか (これを行うためのメソッドが ComponentManagers に既にあるため、私の問題は、これを行うための適切な方法の設計は何ですか)? または、一般に、オペレーティング システムのようにモデル化されたプログラム
(内部カーネルから外部世界までのレイヤー) は、どのようにしてすべてのレイヤー間の通信を実現できるのでしょうか? この目的に役立つ優れた設計パターンはありますか?

どんな助けでも感謝します。

4

1 に答える 1

0

疎結合通信を行う一般的な方法はメッセージングです。基本的にすべてのコンポーネントには受信ボックスがあり、他のコンポーネントはその受信ボックスにメッセージを送信します。グループにブロードキャストするなどのこともできます。

高レベルの抽象化はパフォーマンスに影響を与える可能性があり、ゲームでは高いパフォーマンスが必要になることに注意してください。したがって、コードのホットな部分、つまり非常に頻繁に呼び出される部分には注意する必要があります。

于 2015-06-22T11:10:17.757 に答える