我正在为游戏制作一个实体组件系统。
我使用成员变量将组件实现为结构:

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/

10-11 22:09
查看更多