Saya sering membaca dalam dokumentasi mesin game ECS yang merupakan arsitektur yang baik untuk menggunakan cache cpu dengan bijak.
Tapi saya tidak tahu bagaimana kita bisa mendapat manfaat dari cpu cache.
Jika komponen disimpan dalam array (atau kumpulan), dalam memori yang berdekatan, itu adalah cara yang baik untuk menggunakan cache cpu TAPI hanya jika kita membaca komponen secara berurutan.
Ketika kita menggunakan sistem, mereka membutuhkan daftar entitas yang merupakan daftar entitas yang memiliki komponen dengan tipe tertentu.
Tetapi daftar ini memberikan komponen secara acak, tidak berurutan.
Jadi bagaimana merancang ECS untuk memaksimalkan hit cache?
EDIT:
Sebagai contoh, sistem Fisika membutuhkan daftar entitas untuk entitas yang memiliki komponen RigidBody dan Transform (Ada kumpulan untuk RigidBody dan kumpulan untuk komponen Transform).
Jadi loop untuk memperbarui entitas akan seperti ini:
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
}
Masalahnya adalah bahwa komponen RigidBody dari entitas1 dapat berada di indeks 2 dari kumpulannya dan komponen Tranform dari entitas1 pada indeks 0 dari kumpulannya (karena beberapa entitas dapat memiliki beberapa komponen dan bukan yang lain dan karena menambah / menghapus entitas / komponen secara acak).
Jadi, bahkan jika komponen bersebelahan dalam memori, mereka dibaca secara acak sehingga akan memiliki lebih banyak cache miss, bukan?
Kecuali ada cara untuk mengambil komponen berikutnya dalam loop?