Ich habe oft in den ECS-Game-Engine-Dokumentationen gelesen, dass eine gute Architektur ist, um den CPU-Cache mit Bedacht einzusetzen.
Ich kann mir jedoch nicht vorstellen, wie wir vom CPU-Cache profitieren können.
Wenn Komponenten in einem Array (oder einem Pool) im zusammenhängenden Speicher gespeichert werden, ist dies eine gute Möglichkeit, den CPU-Cache zu verwenden, ABER nur, wenn die Komponenten nacheinander gelesen werden.
Wenn wir Systeme verwenden, benötigen sie eine Entitätenliste, die eine Liste von Entitäten mit Komponenten mit bestimmten Typen enthält.
Diese Listen geben die Komponenten jedoch auf zufällige Weise und nicht nacheinander wieder.
Wie kann man ein ECS entwerfen, um den Cachetreffer zu maximieren?
EDIT:
Beispielsweise benötigt ein physisches System eine Entitätsliste für eine Entität mit den RigidBody- und Transform-Komponenten (es gibt einen Pool für RigidBody- und einen Pool für Transform-Komponenten).
Die Schleife zum Aktualisieren von Entitäten sieht also folgendermaßen aus:
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
}
Das Problem besteht darin, dass sich die RigidBody-Komponente von entity1 am Index 2 ihres Pools und die Tranform-Komponente von entity1 am Index 0 ihres Pools befinden kann (da einige Entitäten einige Komponenten haben können und nicht die andere, und weil Entitäten hinzugefügt / gelöscht werden / Komponenten zufällig).
Selbst wenn Komponenten im Arbeitsspeicher zusammenhängend sind, werden sie zufällig gelesen und haben daher mehr Cache-Fehler, oder?
Gibt es keine Möglichkeit, die nächsten Komponenten in der Schleife vorab abzurufen?