Je lis souvent dans les documentations du moteur de jeu ECS qui est une bonne architecture pour utiliser judicieusement le cache cpu.
Mais je ne peux pas comprendre comment nous pouvons bénéficier du cache cpu.
Si les composants sont enregistrés dans un tableau (ou un pool), dans une mémoire contiguë, c'est un bon moyen d'utiliser le cache cpu MAIS uniquement si nous lisons les composants de manière séquentielle.
Lorsque nous utilisons des systèmes, ils ont besoin d'une liste d'entités qui est une liste d'entités qui ont des composants avec des types spécifiques.
Mais ces listes donnent les composants de manière aléatoire et non séquentielle.
Alors, comment concevoir un ECS pour maximiser le hit du cache?
ÉDITER :
Par exemple, un système Physic a besoin d'une liste d'entités pour l'entité qui a les composants RigidBody et Transform (Il y a un pool pour RigidBody et un pool pour les composants Transform).
Ainsi, sa boucle de mise à jour des entités sera la suivante:
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
}
Le problème est que le composant RigidBody de l'entité1 peut être à l'index 2 de son pool et le composant Tranform de l'entité1 à l'index 0 de son pool (car certaines entités peuvent avoir certains composants et pas l'autre et en raison de l'ajout / suppression d'entités / composants au hasard).
Donc, même si les composants sont contigus en mémoire, ils sont lus au hasard et il y aura donc plus de cache manquant, non?
À moins qu'il n'y ait un moyen de pré-extraire les prochains composants de la boucle?