A menudo leo en el motor del juego ECS las documentaciones que son una buena arquitectura para usar el caché de la CPU con prudencia.
Pero no puedo entender cómo podemos beneficiarnos del caché de la CPU.
Si los componentes se guardan en una matriz (o en un grupo), en memoria contigua, es una buena manera de usar el caché de la CPU PERO solo si leemos los componentes de forma secuencial.
Cuando usamos sistemas, necesitan una lista de entidades que son una lista de entidades que tienen componentes con tipos específicos.
Pero estas listas dan los componentes de forma aleatoria, no secuencialmente.
Entonces, ¿cómo diseñar un ECS para maximizar el golpe de caché?
EDITAR:
Por ejemplo, un sistema Físico necesita una lista de entidades para la entidad que tiene los componentes RigidBody y Transform (hay un grupo para RigidBody y un grupo para componentes Transform).
Entonces su ciclo para actualizar entidades será así:
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
}
El problema es que el componente RigidBody de la entidad1 puede estar en el índice 2 de su grupo y el componente Transformar de la entidad1 en el índice 0 de su grupo (porque algunas entidades pueden tener algunos componentes y no el otro y por agregar / eliminar entidades / componentes al azar).
Entonces, incluso si los componentes son contiguos en la memoria, se leen al azar y, por lo tanto, tendrá más pérdida de caché, ¿no?
¿A menos que haya una forma de buscar previamente los siguientes componentes en el bucle?