Я часто читаю в документации игрового движка 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 объекта entity1 может находиться в индексе 2 его пула, а компонент Tranform объекта entity1 - в индексе 0 его пула (поскольку некоторые объекты могут иметь некоторые компоненты, а не другие, и из-за добавления / удаления объектов / компоненты случайным образом).
Таким образом, даже если компоненты находятся в памяти непрерывно, они читаются случайным образом, и поэтому в них будет больше промахов, не так ли?
Разве есть способ предварительной выборки следующих компонентов в цикле?