コンポーネントベースのアーキテクチャに適した粒度レベルは何ですか?


26

コンポーネントベースのアーキテクチャを使用したゲームに取り組んでいます。Entity一連の所有Componentの組それぞれ有する、インスタンスをSlot格納するとインスタンスを送信し、値を受け取ります。Player必要なコンポーネントとスロット接続を備えたエンティティの生成などの工場機能。

コンポーネントの最適な粒度を決定しようとしています。今、例えばPositionVelocity、とAcceleration直列に接続された全ての別個の構成要素です。VelocityそしてAcceleration容易に均一に書き換えることができるDelta成分、またはPositionVelocity、およびAccelerationのような成分と一緒に組み合わせることができるFrictionGravityモノリシックにPhysicsコンポーネント。

コンポーネントの責任は可能な限り小さくする必要がありますか(相互接続性が犠牲になります)、または関連するコンポーネントを組み合わせてモノリシックコンポーネントにする必要があります(柔軟性が犠牲になります)。前者に傾いていますが、セカンドオピニオンを使用できます。



独自の物理エンジンを使用するか、既存の物理エンジンを統合しますか?
デン

@Den:物理コードを書いていますが、それは決してエンジンではありません。ありふれた2D運動学。
ジョンパーディ

回答:


14

コードの無駄がなく、ブロブのような状態に至る完全な粒度と、コンポーネントアーキテクチャが好まれる理由と使いやすさの間には境界線があります。

明らかなものは持っていることがありPositionますが、それらは必ずしもダイナミックじゃない(なぜ持っているVelocityAcceleration?)。ただし、a Velocityを含むものは移動オブジェクトになるため、Accelerationグループ化することも理にかなっています。

vaが必要になるケースがありますが、物理シミュレーションは必要ありませんか?同様に、Gravityそれらが物理オブジェクトではない場合にポイントがありますか?

tl; dr意味のあるものをグループ化します。


1
公平ですね。私のシステムには、中央集権化がほとんどありません。物理学に参加するコンポーネントとコンポーネントEntityがあれば、それは事実上の物理的です。私ができることは、論理的なグループ化のためにいくつかのコンポーネントを追加し、すべての基本的なコンポーネントを単一の責任に保つことだと思います。追加するので、言うには、追加するのと同じ効果だろう、などを。PositionPositionEntityMovableEntityPositionVelocityAcceleration
ジョンパーディ

6

重く始めることで提案するすべての変数を細かく管理することを避けるために、責任を中心とした区分を選択し、状況が論理的に現れたときにリファクタリングします。最初のデザインは紙で始めることができます。ある時点で、これらの大きな責任の分担があなたのエンティティの構成要素になります。

急ぎの例として、ゲームがあります。ゲームは環境+状態に分割されます。環境はStaticWorld + MovingStuffに分割されます。状態はAIControlled + PlayerControlledに分割されます。ダメージの大まかな概念は、TakesDamage + GivesDamageに分かれています。

等々。

「エンジンではなくゲームを構築する」という一般的なアドバイスによく似ています。新しい開業医には、「精巧なコンポーネントシステムではなく、ゲームを構築する」ことをお勧めします。実行中のゲームでの個人的な経験がある場合にのみ、将来の作品で精巧なコンポーネントシステムが必要かどうかを知ることができるからです。


私は新しい開発者ではありません。私はむしろ行動よりも概念(すなわち、トップダウンボトムアップ対)に基づいたコンポーネントを持っている場合は、私のアーキテクチャは、よりもろくなり、ないだろう、より手の込んだ?小さなコンポーネントに必要な動作を実装することはできますが、事前に結合されたコンポーネントから目的の動作を取得できるとは限りません。言うまでもなく、1つのゲームのコンテキストであっても、達成したいすべてを予測することはできません。
ジョンパーディ

ボトムアップの欠点は、コンポーネント間の通信が問題になることであり、人々は自分たちがモデリングしているものの規模ではあまりにも細かく始める傾向があるということです。私は主に、経験の浅い人のために、「xyzはコンポーネント」、「回転はコンポーネント」、「rgbはコンポーネント」レベルからスーパーマイクロを避けようとしていました。
パトリックヒューズ

けっこうだ。私はあなたを正しく理解したかどうかを確かめたかっただけです。私が持っているスロットシステムでは、コンポーネントの通信が簡単で効率的であるため、「スーパーマイクロ」スケールの欠点はまったくありません。私はこれをスタンドアロンエンジンにリファクタリングするつもりはありませんが、もしそうすれば、The Communist Duck's answerのコメントで言及したコンポーネントグループなどの抽象化をいつでも導入できます。
ジョンパーディ

4

私の推測では、多くの相互作用を持つコンポーネントを組み合わせます。あなたの場合、私は単一のコンポーネントで位置を保ち、物理コンポーネントで速度と加速度を一緒に保ちます。

ただし、ゲームの機能に大きく依存します(特定のゲームを念頭に置いてフレームワークを構築している場合を除きます)。


2
コンポーネントと多くの相互作用を組み合わせる際の問題は、他の部分が必要ない場合があることです。
共産主義のダック

4

これは古い質問ですが、多分誰かがこの答えを役に立つと思うでしょう。

私は信じてSystems、より良いあなたがコンポーネントを構築する方法を理解するのに役立ちます。システムは、単純なゲッター/セッターおよびヘルパー関数を除き、コンポーネントが独自のロジックを含まないアーキテクチャに存在します。システムは、コンポーネントの要件を満たすエンティティで動作します。これが、他のデータなしで処理されるデータにとって意味がある限り、コンポーネントデータを分離することが最善である理由です。

たとえば、に基づいてMovementSystemエンティティを更新するがあります。これは、ゲーム内の単純なエンティティ用です。ただし、プレイヤー敵の場合、で処理される動きが必要になる場合があります。しかし、障害物についてはあなたが望むかもしれません。地形はまた、摩擦があるかもしれませんが、それは速度成分を持っていません。しかし、どうですか?Player、Enemy、およびObstacleを追加し、それを処理するために作成します。PositionVelocityAccelerationAcceleratedMovementSystemFrictionGravityGravitySystem

一番下の行は、あなたがより分離されいれComponentsいるほど、を使用するときにより拡張性があるというEntitiesことSystemsです。

編集:最後のステートメントを明確にしました。

編集:さて、私は自分のシステムに取り組んでおり、この実現に来ました。位置と速度を分割する例は、速度を操作すると、MovementSystemで位置が変化することです。その結果、MovementSystemはVelocityの変更を取得してPositionに適用するため、「InputMovementSystem」はPlayerをユーザー入力から移動させるためにPositionを必要としません。確かに、それらをまとめることはそれでもうまくいきますが、それが必要ない理由の例です。


最近、次のようなブログ投稿を読みました。

「2つの異なるコンポーネントでグループ化できるデータがある場合、そのデータを使用して3つ目のコンポーネントを作成することをお勧めします。」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.