Często czytam w dokumentacji silnika gry ECS, która jest dobrą architekturą do rozsądnego używania pamięci podręcznej procesora.
Ale nie mogę zrozumieć, w jaki sposób możemy skorzystać z pamięci podręcznej procesora.
Jeśli komponenty są zapisywane w tablicy (lub puli), w ciągłej pamięci, to dobry sposób na użycie pamięci podręcznej procesora, ALE tylko wtedy, gdy czytamy komponenty sekwencyjnie.
Kiedy używamy systemów, potrzebują one listy jednostek, które są listą jednostek, które mają komponenty o określonych typach.
Ale te listy podają komponenty w sposób losowy, a nie sekwencyjny.
Jak więc zaprojektować ECS, aby zmaksymalizować trafienie w pamięci podręcznej?
EDYTOWAĆ :
Na przykład system fizyczny potrzebuje listy encji dla encji, która ma komponenty RigidBody i Transform (istnieje pula dla RigidBody i pula dla komponentów Transform).
Więc jego pętla do aktualizowania jednostek będzie wyglądać następująco:
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
}
Problem polega na tym, że komponent RigidBody encji1 może znajdować się w indeksie 2 swojej puli, a komponent Tranform encji1 w indeksie 0 swojej puli (ponieważ niektóre encje mogą mieć niektóre komponenty, a nie inne oraz z powodu dodawania / usuwania encji / komponenty losowo).
Więc nawet jeśli komponenty są przylegające do pamięci, są odczytywane losowo, więc będzie mieć więcej pamięci podręcznej, prawda?
Chyba że istnieje sposób, aby wstępnie pobrać kolejne składniki w pętli?