Leggo spesso nelle documentazioni del motore di gioco ECS che è una buona architettura per usare saggiamente la cache della CPU.
Ma non riesco a capire come possiamo beneficiare della cache della CPU.
Se i componenti vengono salvati in un array (o in un pool), nella memoria contigua, è un buon modo di usare la cache della CPU MA solo se leggiamo i componenti in sequenza.
Quando usiamo i sistemi, hanno bisogno di un elenco di entità che sono un elenco di entità che hanno componenti con tipi specifici.
Ma questi elenchi forniscono i componenti in modo casuale, non in sequenza.
Quindi, come progettare un ECS per massimizzare l'hit della cache?
MODIFICARE :
Ad esempio, un sistema fisico necessita di un elenco di entità per entità con i componenti RigidBody e Transform (esiste un pool per RigidBody e un pool per i componenti Transform).
Quindi il suo ciclo per l'aggiornamento delle entità sarà così:
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
}
Il problema è che il componente RigidBody dell'entità1 può trovarsi nell'indice 2 del suo pool e il componente Tranform dell'entità1 nell'indice 0 del suo pool (perché alcune entità possono avere alcuni componenti e non l'altro e a causa dell'aggiunta / eliminazione di entità / componenti casualmente).
Quindi, anche se i componenti sono contigui in memoria, vengono letti in modo casuale e quindi avrà più cache miss, no?
A meno che non ci sia un modo per precaricare i componenti successivi nel ciclo?