在对象矢量中的空对象与指针矢量中的NULL / nullptr

时间:2015-02-20 14:04:26

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

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

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

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

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

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

例如:

使用空对象/空指针:
ComponentType1:[x] [x] [x]
ComponentType2:[x] [0] [x]

无:
ComponentType1:[x] [x] [x]
ComponentType2:[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吗?

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

编辑:
- 我正在计划不是实际对象的实体,即实体只是向量的索引。这样,以后在诸如绘图之类的系统上可以简单地遍历包含精灵组件的向量,而无需关心它们的精灵。

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

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

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

-healthComponent只是一个组件的一个例子,但它包含有关实体健康状况的信息和影响健康的信息(健康点,护甲等)我正在考虑将它们简单化为结构(组件)。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可能需要查看boost::optional