【问题标题】:Empty Objects in a Vector of Objects vs NULL/nullptr in a Vector of Pointers对象向量中的空对象与指针向量中的 NULL/nullptr
【发布时间】:2015-04-22 05:48:42
【问题描述】:

我正在尝试创建一种实体/组件系统,其中唯一标识实体的是组件向量的索引。

这应该是所谓的实体组件系统的一种实现。这是我正在开发的游戏。

例如,有一个精灵组件的向量和一个健康组件的向量,并且它们上的相同索引是同一实体的一部分。 IE。 spriteComponents[0] 与 healthComponents[0] 属于同一实体。

我遇到的问题是,并非所有实体都具有所有类型的组件。这意味着我必须在其组件类型实体不必保持 index = entity id 系统完整性的向量上推送某种空/null。

即实体 1(索引 1)没有 spriteComponent,因此 spriteComponents[1] 应该是某种空/null。

例如:

使用空对象/空指针:
组件类型 1:[x][x][x]
组件类型2:[x][0][x]

没有:
组件类型 1:[x][x][x]
组件类型2:[x][x]

没有它们,索引将无法正常工作。

现在我有两个选择,两个都应该工作,但我想知道哪个是更好的方法:

//Option 1:
std::vector<SpriteComponent> spriteComponents;

/*Add empty object to retain index = entity system
when entity does not have a particular component*/

spriteComponents.push_back(SpriteComponent());

//Option 2:
std::vector<std::shared_ptr<SpriteComponent>> spriteComponents;

/*Add nullptr to retain index = entity system
when entity does not have a particular component*/

spriteComponents.push_back(nullptr);

据我了解,选项 1 的优点是对象在内存中是连续的,但使用空对象似乎不是最理想的。这仍然比使用可以简单地使用 nullptr/NULL 的指针更可取吗?

当然,如果有更好的选择,我愿意接受建议。

编辑:
-我计划实体不是实际对象,即实体只是向量的索引。这样一来,以后的系统(例如绘图)就可以简单地遍历包含精灵组件的向量,而无需关心它们是谁的精灵。

这应该是相当有效的,因为它们在内存中彼此相邻,而在 Entity 将是包含 spriteComponent 和 healthComponent 等的类的系统中。迭代将大大降低效率(或者我理解。)因为相似的组件在内存中可能相距甚远。

实际上让实体作为仅包含必要索引的对象存在可能是一个可行的解决方案。然后我也可以让它们包含一个数字,告诉它实际上有哪些组件,没有。

-组件不会在实体之间共享。

-healthComponent 只是组件的一个示例,但它会包含有关实体健康状况的信息和影响健康状况的信息(健康点、盔甲类等)。我正在考虑让它们简单地成为结构(组件)。

谢谢。

【问题讨论】:

  • 为什么不把精灵和健康放在一个结构体中?
  • 更多关于您的游戏的背景信息可以帮助我们为设计提供建议。例如,几个对象实例会共享相同的组件数据吗?什么是健康组件?
  • 实体可能有每个组件的索引(因此您可以在没有漏洞的情况下迭代您的组件)。

标签: c++ c++11 memory-management vector null


【解决方案1】:

你可能想看看boost::optional

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 2011-02-11
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多