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

5
我正在尝试在C++中制作高效的“实体系统”,我已经阅读了很多关于这方面的博客/文章/文档来获取信息,但我仍有一些问题。
我发现了两个有趣的主题:
- 数据驱动系统 - 实体组件系统
对我来说,这两个系统看起来非常相似。
因此,我找到了Adam Smith的这个例子:https://dev59.com/bXI-5IYBdhLWcg3w3cc8#2021868 我需要一个像这样灵活的系统:
// Abstract class
class Component
{
     // data here
}

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

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

如果我的实体具有以下组件:汽车、变形、精灵,那么我的组件数组是否会像数据驱动系统一样具有线性数据?

现在,我有系统:

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');
           ...
       }
    }
}
  • 我曾经看到过虚函数很糟糕,但在这种情况下会出现什么问题吗?
  • 使用 Get component 需要一个 static_cast,这是不好的吗?
  • 在数据驱动系统中,我看到了指针,那原始变量在哪里,我需要到处放置新的数据还是可以使用一个数组类?
  • 我的做法正确吗?

所有这些问题在我的脑海中都有些模糊。


5
我会尽力为您翻译。以下是需要翻译的内容:在我的脑海里也像是"模糊"的感觉。你想要达成什么目标,你面临了哪些具体问题?不必担心完成设计流行语清单上的项目。 - Lightness Races in Orbit
我想要一个高效的组件系统。我已经使用组件从实体中创建了一个实体系统,但在旧的移动设备和平板电脑上性能并不是很好。因此,我发现了数据驱动的方法,看起来非常有趣,所以我想尝试一下。 - Sooner
1
你又在列举流行语了!为什么你想要一个“组件系统”,它与源文件中的一堆类有何不同? - Lightness Races in Orbit
如果你仍然感兴趣,我已经在C ++中创建了一个实体系统。https://bitbucket.org/miguelishawt/anax-entity-system - miguel.martin
entity->getComponent('sprite'); 呃,那真是令人讨厌,希望你不是字面意思。 - Khlorghaal
显示剩余2条评论
1个回答

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

  1. 好的,谢谢。
  2. 在那种情况下不可能,我需要分别处理每个组件并赋予不同的行为。
  3. 好的,所以如果我有一个 "Component*" 的向量,我的数组将是线性的(仅填充了Car,因此在内存中大小相同?[链接]http://fr.slideshare.net/DICEStudio/introduction-to-data-oriented-design#btnNext[链接])。
- Sooner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接