5

我正在尝试用 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 哪里是“原始”变量,我需要在任何地方放置新变量,否则我将拥有一个包含相同数据数组的类?
  • 我做对了吗?

在我看来,所有这些观点都显得“模糊”。

4

1 回答 1

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