我正在为游戏制作一个实体组件系统。
我使用成员变量将组件实现为结构:
struct Position
{
float x;
float y;
}
struct Render
{
unsigned int texture;
}
一切都很好,并且尽可能简单,如果我想添加新的组件类型,则必须创建一个新的struct并将其添加到代码中。
但这是一个问题:
我想让玩家能够在游戏已经编译后创建可以添加新组件类型的mod吗?
例如,假设调制器提供了一个定义组件的文件,该文件包含以下内容:
position
float x
float y
我可以做到的一种方法是使每个组件都有一个映射,该映射将字符串(变量名)与其值映射。我将有一张地图用于整数,一张地图用于浮点数,依此类推。然后该组件将如下所示:
struct Component
{
string type;
map<string, int> ints;
map<string, float> floats;
}
然后,游戏将读取定义组件的文件,并将变量添加到地图中。
现在我的问题是:
这是一个好主意吗?
由于我每帧都访问这些变量,因此由于映射,访问速度会变慢吗?
什么是解决此问题的最佳方法?
编辑:
我应该指出,这些文件定义了全新的struct类型,因此不要在代码中手动添加如下内容:
struct Health
{
float max_hp;
float hp;
}
我会写一个包含以下内容的文件:
health
float max_hp
float hp
并让游戏从中读取类定义。
最佳答案
您的对象可以具有一组原始属性和自定义属性。您的引擎必须依靠原始属性的存在,并且通常不会访问自定义属性。例如,在mods中定义“ position”属性是没有意义的,因为引擎必须依赖该属性的存在,并且将以非常特殊的方式使用它。另一方面,可以在mod中使用的脚本语言中使用custom属性。如果以这种方式组织,则不会出现速度问题。低级属性以最大速度访问,而自定义属性通过名称访问,但是与脚本语言的解释相比,速度的小损失可以忽略不计。
关于c++ - 在C++中创建数据驱动的结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20934769/