像C ++一样编写高效的实体系统

时间:2012-12-05 20:30:25

标签: c++ performance architecture data-driven

我正在尝试用C ++创建一个高效的“实体系统”,我在互联网上阅读了很多博客/文章/文档来获取大量信息,但我又有了一些问题。

我发现了两个有趣的主题:

  • 数据驱动系统
  • 实体组件系统

对我来说,这两个系统看起来非常相似。

所以,我发现亚当·斯密的这个例子:https://stackoverflow.com/a/2021868

我需要一个灵活的系统:

// Abstract class
class Component
{
     // data here
}

// exemple
class Car : public Component
{
    // Data here
}

// Entity with components
class Entity
{
   std::vector<Component*> components;
}

所以,如果我的实体有以下组件:Car,Transform,Sprite, 我的组件数组是否会有数据驱动系统等线性数据?

现在,我有系统:

class System 
{
     virtual void init();
     virtual void clear();
     virtual void update();

     std::unordered_map< const char*, Entity*> entities;
}

class RendererSystem : public System
{
    // Methods's definition (init, clear, …).

    void update()
    {
       for( entity, … )
       {
           Sprite* s = entity->getComponent('sprite');
           ...
       }
    }
}
  • 我读过虚拟功能很糟糕,在这种情况下很糟糕吗?
  • 获取组件需要static_cast,这很糟糕吗?
  • 在数据驱动的系统中,我看到指针到处都是,si在哪里是“原始”变量,我需要在任何地方放置新的或者我将有一个具有相同数据数组的类?
  • 我做对了吗?

所有这些观点在我脑海中都显得“模糊”。

1 个答案:

答案 0 :(得分:1)

  1. 虚拟函数确实有一些开销,但除非你每秒进行数百万次调用,否则你不应该关心任何事情,所以忽略这一事实。
  2. 静态强制转换本身并不坏,但它会破坏使用它的静态类型检查,因此如果您可以在您投射的对象内部移动行为,那么您只需调用适当的方法而无需知道特定的运行时一个对象的实例然后它更好
  3. 目前还不清楚你在问什么,即使你在数据驱动的方法中有元素的向量,集合中的每个元素都需要用new分配(如果它是一个指针)。然后,一旦您分配了它,您将无需在将引用​​传递给
  4. 项目后立即再次执行此操作