CPU önbelleğini akıllıca kullanmak için iyi bir mimari olan ECS oyun motoru belgelerinde sık sık okurum.
Ama cpu önbelleğinden nasıl faydalanabileceğimizi anlayamıyorum.
Bileşenler bir diziye (veya bir havuza), bitişik belleğe kaydedilirse, yalnızca bileşenleri sırayla okursak cpu önbelleği kullanmak için iyi bir yoldur.
Sistemleri kullandığımızda, belirli tipte bileşenlere sahip varlıkların listesi olan varlık listesine ihtiyaç duyarlar.
Ancak bu listeler, bileşenleri sıralı olarak değil rastgele bir şekilde verir.
Peki, önbellek vuruşunu en üst düzeye çıkarmak için bir ECS nasıl tasarlanır?
DÜZENLE :
Örneğin, bir Fizik sistemi, RigidBody ve Transform bileşenlerine sahip varlık için bir varlık listesine ihtiyaç duyar (RigidBody için bir havuz ve Transform bileşenleri için bir havuz vardır).
Varlıkları güncelleme döngüsü şu şekilde olacaktır:
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
}
Sorun, varlık1'in RigidBody bileşeninin havuzunun indeksinde 2 ve havuzunun 0 dizininde varlık1'in Tranform bileşeninde olabilmesidir (çünkü bazı varlıklar diğerine değil bazı bileşenlere sahip olabilir ve varlık ekleme / silme nedeniyle / bileşenler rastgele).
Bileşenler bellekte bitişik olsa bile, rastgele okunurlar ve bu yüzden daha fazla önbellek özlemi olur, değil mi?
Döngüdeki sonraki bileşenleri önceden getirmenin bir yolu yoksa?