我经常阅读ECS游戏引擎文档,这是明智使用cpu缓存的良好架构。
但是我不知道如何从cpu缓存中受益。
如果将组件保存在连续内存中的数组(或池)中,则只有在顺序读取组件的情况下,才是使用cpu缓存BUT的好方法。
当我们使用系统时,它们需要实体列表,这些列表是具有特定类型组件的实体列表。
但是这些列表以随机的方式而不是顺序地提供了组件。
那么如何设计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
}
问题在于,entity1的RigidBody组件可以在其池的索引2处,而entity1的Tranform组件在其池的索引0处(因为某些实体可以具有某些组件,而其他组件不能具有其他组件,并且是因为添加/删除了实体/组件)。
因此,即使组件在内存中是连续的,也会随机读取它们,因此它将有更多的缓存未命中,不是吗?
除非有一种方法可以预取循环中的下一个组件?