Я часто читаю в документаціях на ігровий механізм ECS, що є гарною архітектурою для розумного використання кеш-пам'яті.
Але я не можу зрозуміти, як ми можемо отримати вигоду з кеш-процесора.
Якщо компоненти зберігаються в масиві (або пулі), у постійній пам'яті, це хороший спосіб використовувати кеш-процесор, АЛЕ, якщо ми читаємо компоненти послідовно.
Коли ми використовуємо системи, їм потрібен перелік об'єктів, який є переліком об'єктів, які мають компоненти з певними типами.
Але ці списки надають компоненти випадковим чином, а не послідовно.
Тож як створити ECS для максимального збільшення кешу?
Редагувати:
Наприклад, фізичній системі потрібен список сутностей для сутності, що має компоненти RigidBody та Transform (Є пул для RigidBody та пул для компонентів Transform).
Тож його цикл для оновлення об'єктів буде таким:
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
}
Проблема полягає в тому, що компонент RigidBody entiteta1 може знаходитись в індексі 2 свого пулу, а компонент Tranform сутності1 в індексі 0 свого пулу (тому що деякі об'єкти можуть мати деякі компоненти, а не інші, і через додавання / видалення сутності / компоненти довільно).
Тож навіть якщо компоненти несумісні в пам'яті, вони зчитуються випадковим чином, і це матиме більше пропусків кешу, ні?
Якщо тільки не існує способу попереднього вибору наступних компонентів у циклі?