我的目标是为特定班级的每个孩子创建一个唯一ID(以0开头)。我不确定它是否有可能以我想要的方式,但我想我在这里要求作为最后的手段。
某些背景信息:
我正在创建自己的2D游戏引擎,我希望它有一个ECS作为它的骨干(在任何人说什么之前,我做这个作为学习经验,我知道我可以使用现有的游戏引擎)。我的想法是每个实现' EntityComponent' class应该有一个唯一的ID。这需要是每个孩子,而不是每个对象。我想使用此ID作为数组的索引来查找实体的组件。每个Component获得的实际ID并不重要,每个运行时都不需要为每个组件分配ID。
我希望有一些方法可以为每个类创建一个类似于静态变量的东西(它实现了Entity Component类)。它需要快速获取此值,因此执行unordered_map查找比我想要的慢。我不想做的一件事就是自己设置每个组件的ID。一旦制作了许多组件,这可能会导致问题,如果我忘记设置它或将两个组件设置为相同的ID,可能会导致问题。
我的一个想法是在EntityComponent中创建一个名为ID的变量(以及获取它的getter)。构造实体时,它会查找无序映射(在运行时创建,为每个类分配ID)以获取它应具有的ID。建设一次查询的价格很好。我看到的唯一问题是有很多冗余数据(虽然整体看来它会占很小的数量)。有了这个,每个转换组件都必须存储它的ID是x。这意味着当只有1个真正需要时,可能存在成千上万个转换组件存储此ID值。
基本上我正在寻找一种类型TYPE的极快方法。这可以通过查找,但需要快速查找。如果可能的话,我想要比unordered_map更快的东西。如果这可以通过编译时间技巧(也许是枚举?)或甚至模板来完成,我很乐意听到您的想法。我知道过早优化是不好的,但能够快速获得组件是一件非常重要的事情。
我问的问题很可能是不可能的。我以为我先问这里先确定一下。我还应该注意到我试图避免在子课程中实现这一点。我不想为每个子类设置相同的代码来创建id。
谢谢。
答案 0 :(得分:0)
为了获得与对象的实际类型相对应的内容,它需要在对象本身中或通过虚函数访问。否则,类型将由与其关联的变量的类型确定。
当速度和大小都很重要时,常见的选项是使用与每种类型相关联的整数标识符(在编译时已知完整类型列表时),并在需要执行某些操作时以特定方式使用该整数值基于类型。
整数机制通常使用enum
为每种类型生成相应的值,并在每个对象中包含该字段。
虚拟方法种类繁多,我在每个类中使用了boost :: uuid和一个静态数据成员,并且虚拟方法得到了它。
答案 1 :(得分:0)
在newId()
中声明虚拟函数EntityComponent
。
实现此函数以获取和增加每个类中的静态变量,您希望哪些子项具有唯一ID。
在构造函数中分配Id:
mId = newId();
答案 2 :(得分:0)
如果这是你的意思,我不知道这个,我知道这是一个老帖子,但这是我目前处理类似问题的方式,也许它会帮助别人。 (我也将此作为大学的学习经历:))
在控制类或其自己的实用程序类中:
enum class EntityType{ TYPE_ONE = 0, TYPE_TWO =1};
在类标题中:
#include "EntityType.h"
class Whatever{
public:
inline void getType(){return _type;}
OR
inline void getType(){return EntityType::TYPE_ONE;}
private:
EntityType _type = EntityType::TYPE_ONE;
};
希望这对任何人都有帮助:))