CPUキャッシュを賢く使用するための優れたアーキテクチャであるECSゲームエンジンのドキュメントをよく読みます。
しかし、CPUキャッシュの利点を理解することはできません。
コンポーネントが連続したメモリの配列(またはプール)に保存されている場合、コンポーネントを順番に読み取る場合にのみCPUキャッシュを使用するのが良い方法です。
システムを使用する場合、特定のタイプのコンポーネントを持つエンティティのリストであるエンティティリストが必要です。
ただし、これらのリストは、順番ではなくランダムな方法でコンポーネントを提供します。
それでは、キャッシュヒットを最大化するECSを設計する方法は?
編集:
たとえば、物理システムには、RigidBodyおよびTransformコンポーネントを持つエンティティのエンティティリストが必要です(RigidBodyのプールとTransformコンポーネントのプールがあります)。
したがって、エンティティを更新するためのループは次のようになります。
for (Entity eid in entitiesList) {
// Get rigid body component
RigidBody *rigidBody = entityManager.getComponentFromEntity<RigidBody>(eid);
// Get transform component
Transform *transform = entityManager.getComponentFromEntity<Transform>(eid);
// Do something with rigid body and transform component
}
問題は、entity1のRigidBodyコンポーネントがそのプールのインデックス2にあり、entity1のTranformコンポーネントがそのプールのインデックス0にあることです(一部のエンティティは他のコンポーネントを持たず、エンティティを追加/削除するため/ランダムにコンポーネント)。
コンポーネントがメモリ内で連続している場合でも、それらはランダムに読み取られるため、キャッシュミスが多くなります。
ループ内の次のコンポーネントをプリフェッチする方法がない限り?