Java で新しいエンティティ システムを構築しています。私が提案した方法が、アーキテクチャ上またはパフォーマンス上の問題を引き起こすかどうか疑問に思っています。
私が欲しい:
...
for (Entity entity : entities)
{
for (Entry<String, Component> entry : entity.components.entrySet()) //collection is a Map
{
Component component = entry.getValue();
component.update(deltaTime);
}
}
...
対望ましくない代替手段:
...
for (Entity entity : entities)
{
if (entity.componentA != null)
entity.componentA.update(deltaTime);
if (entity.componentB != null)
entity.componentB.update(deltaTime);
//etc. for as many components as the entity has. Finite, but possibly many.
}
...
最初のアプローチでは、HashMap アプローチに関して私が考えたことがいくつかあります。
- 私は不必要な条件を避けます (何千ものエンティティが
update()
呼び出されている場合は自明ではありません)。 - 読み取りアクセス時間は平均で O(1) です (取得できない可能性が高いのは、ハッシュ衝突の場合のみです)。
HashMap.entrySet()
for-each 構文を使用してコレクションを反復処理するために呼び出す必要があります。ドキュメントからわかるように、「コレクション[セット]はマップに支えられています」。ただし、呼び出されるたびに HashMap が内部的にセットを作成しているかどうかはわかりませんentrySet()
。