Costumo ler as documentações do mecanismo de jogo do ECS, que são uma boa arquitetura para usar o cache da CPU com sabedoria.
Mas não consigo descobrir como podemos nos beneficiar do cache da CPU.
Se os componentes forem salvos em uma matriz (ou pool), na memória contígua, é uma boa maneira de usar o cache da CPU, MAS apenas se lermos os componentes sequencialmente.
Quando usamos sistemas, eles precisam de uma lista de entidades, que é uma lista de entidades que possuem componentes com tipos específicos.
Mas essas listas fornecem os componentes de maneira aleatória, não sequencial.
Então, como projetar um ECS para maximizar o acerto do cache?
EDIT:
Por exemplo, um sistema Physic precisa de uma lista de entidades para entidades que possuam os componentes RigidBody e Transform (existe um pool para RigidBody e um pool para componentes Transform).
Portanto, seu loop para atualizar entidades será assim:
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
}
O problema é que o componente RigidBody da entidade1 pode estar no índice 2 do seu pool e o componente Tranform da entidade1 no índice 0 do seu pool (porque algumas entidades podem ter alguns componentes e não o outro e devido à adição / exclusão de entidades / componentes aleatoriamente).
Portanto, mesmo que os componentes sejam contíguos na memória, eles são lidos aleatoriamente e, portanto, haverá mais falta de cache, não?
A menos que haja uma maneira de pré-buscar os próximos componentes no loop?