如果您不熟悉内存访问和缓存使用,我建议您参考 Nikolai 的链接,该链接指向“每个程序员应该了解的内存”。
至于手头的问题:
我建议将每种组件类型存储在它们自己的池中,它们将存储在连续的数组中。前任:
ComponentPool<CollisionComponent> mCollisionComponents;
ComponentPool<MeshComponent> mMeshComponents;
...
当您分配一个GameObject
(也就是从池中拉出它)时,分配对象需要的特定组件。
现在,您应该避免对组件执行此操作:
void SomeCollisionWork() {
for each object {
if(object.hasCollisionComponent()) {
DoCollisionWork(object.collisionComponent)
}
}
}
相反,您可以像这样处理它:
void SomeCollisionWork() {
for each allocated component in mCollisionComponents {
DoCollisionWork(component)
}
}
如果您确实需要原始GameObject
(或该对象的其他组件),您可以在每个组件中存储一些数据(例如,游戏对象的索引)。使用对象的索引,您可以在 other 中访问其其他组件ComponentPool
。
这一切的意义何在?将功能分成特定的块或“作业”变得非常容易。然后,如果您有不相互依赖的组件,您可以并行处理它们(对于“未来”性能很重要)。
有关这方面的更多信息,我建议查看 Insomniac Games 开发的动态组件系统的演示文稿(请务必阅读演讲者笔记):https ://docs.google.com/present/edit?id=0ATIohmzo6z7TZGhjbmhidnFfMTg1MWNkcTJmcWZ4&hl =zh