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

Soo*_*ner 5 c++ architecture performance data-driven

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

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

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

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

所以,我发现了Adam Smith的这个例子: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;
}
Run Code Online (Sandbox Code Playgroud)

所以,如果我的实体有以下组件: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');
           ...
       }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 我已经读过虚拟功能很糟糕,在这种情况下它很糟糕?
  • 获取组件需要一个static_cast,这很糟糕吗?
  • 在数据驱动系统中,我看到指针到处都是,si在哪里是"原始"变量,我需要在任何地方放置新的或者我将拥有一个具有相同数据数组的类?
  • 我做对了吗?

所有这一点在我脑海中看起来都很模糊.

Jac*_*ack 1

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