1

这些天我都在关注性能,因为我正在开发我的第一个游戏引擎。我不是 C++ 专家,但经过一些研究,我发现了缓存和内存对齐的重要性。

基本上我发现,如果您需要一起访问它们,例如在循环中,建议特别对齐内存。

现在,在我的项目中,我正在做我的游戏对象管理器,并且我正在考虑拥有一组游戏对象引用。这意味着我将一个接一个地拥有我的对象的实际记忆。

static const size_t MaxNumberGameObjects = 20;
GameObject mGameObjects[MaxNumberGameObjects];

但是,由于我将实现基于组件的设计,其中游戏对象将具有组件列表(M​​esh、RigidBody、Transformation 等),我会从数组中获得一些东西吗?

无论如何,我见过一些人只是使用一个简单的 std::map 来存储游戏对象。那你们怎么看?

我最好使用组件模型吗?

4

2 回答 2

3

互联网上有很多关于缓存利用的资源,但您可能想研究每个程序员应该了解的关于内存的知识,以更好地了解缓存和内存系统。

快速要点 - 使您的对象很好地适合缓存行并分离“热”和“冷”数据。

于 2010-05-22T19:42:38.100 回答
1

如果您不熟悉内存访问和缓存使用,我建议您参考 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

于 2010-06-04T00:29:25.507 回答