注:この紹介はエンティティシステムに関するものです。しかし、これらが何であるかを知らない場合、または自分で実装していない場合でも、それはかなり基本的なことであり、一般的なJavascriptの経験がある場合は、おそらく答えるのに十分すぎるほどの資格があります。
T=machineブログでエンティティシステムに関する記事を読んでいます。
著者のAdamは、エンティティはIDである必要があり、そのコンポーネント(つまり、エンティティが表すことになっている実際のデータ)を取得するために使用できると提案しています。
すべてのエンティティを「1か所」に保存するモデルを選択しました。このストレージを実装する主な疑いは、多くの人が使用する配列の配列アプローチです。これは、属するコンポーネントのインデックスを表す動的なエンティティIDを意味します。コンポーネントはその「1つの場所」(これからは単に「ストレージ」と呼びます)でタイプごとにグループ化されますが、これをとして実装する予定です。は、エンティティの構成、ストレージを処理し、エンティティ(など)に対していくつかの基本的な操作を実行できるオブジェクトになります。Scene
Scene
.addComponent(entityID, component)
私はオブジェクトについて心配していませんScene
、それが良いデザインであるとかなり確信しています、しかし私が確信していないのはストレージの実装です。
私には2つの選択肢があります:
A)ストレージが次のようになるアレイオブアレイアプローチを使用します。
//storage[i][j] - i denotes component type, while j denotes the entity, this returns a component instance
//j this is the entity id
[
[ComponentPosition, ComponentPosition, ComponentPosition],
[ComponentVelocity, undefined, ComponentVelocity],
[ComponentCamera, undefined, undefined]
]
//It's obvious that the entity `1` doesn't have the velocity and camera components, for example.
B)ストレージオブジェクトをディクショナリ(技術的にはJavascriptのオブジェクト)として実装します
{
"componentType":
{
"entityId": ComponentInstance
}
}
辞書のアプローチは、エンティティIDが静的であることを意味します。これは、エンティティシステム自体の外部でゲームループやその他の機能を実装するのに非常に良いことのようです。また、これは、システムが関心のあるエンティティIDの配列を簡単に格納できることを意味します。entityId変数も、明らかに整数インデックスではなく文字列になります。
配列の配列アプローチに反対する理由は、エンティティを削除すると、単一のエンティティが削除されたときに他のエンティティIDが変更されるためです。
実際の実装の詳細には注意が必要かもしれませんが、パフォーマンスの面でどちらのアプローチが優れているか知りたいですか?
私も興味を持っていること(可能な限りクロスプラットフォームにしてください。ただし、必要に応じて、例としてV8を使用してください)。
- プロパティにアクセスするときのオーバーヘッドはどのくらいですか、そしてそれは蹄の下でどのように実装されていますか?ローカルスコープ内からアクセスしているとしましょう。
- メモリには何が
undefined
あり、どれくらいかかりますか?配列の配列アプローチでは、すべての内部配列が同じ長さである必要があり、エンティティに特定のコンポーネントがない場合、そのフィールドはに設定されるため、これを尋ねますundefined
。