我一直在阅读关于ECS框架的许多讨论,我经常看到通过名称而不是通过字符串对象(如enum
或struct
)来引用组件。
我开始自己构建一个测试实现,并且觉得它们应该有一个强类型,而不是一个字符串,这样我就可以从列表中选择我要寻找的组件,而不是用字符串来“猜测”。
举个例子,你会经常看到:
Entity.GetComponent("Position");
而不是:
Entity.GetComponent(ComponentTypes.Position);
发布于 2014-03-09 17:07:03
ECS特别擅长于数据驱动的开发,而不是由程序员硬编码,这就是为什么您看到字符串标识符的使用模式(除了使用枚举合并多个源而不是碰撞空间的问题)。
地图是相当快的,除非你运行成千上万的每帧,在这种情况下,其他东西需要修理。有些人使用预编译步骤,用标识符包装字符串(“位置”),在编译时将其转换为CRC,这样它运行得更快。
如果要在代码中构建实体,则可以使用所有组件字符串保持引用窗口。
发布于 2014-03-09 05:23:23
我认为这是因为您希望ECS可以在多个项目中使用,并且可以随时进行扩展。如果在ECS库中使用enum
,则用户无法在不更改库本身的情况下创建自己的组件。
发布于 2014-03-10 00:58:36
如果您不想像这样使用字符串,那么很容易避免它。
const string POSITION = "position";
然后,您可以使用const标识符来引用实体而不是字符串本身。这可能有助于减少打字量。@Patrick已经提供了您想要字符串的原因。如前所述,散列速度快,内存访问不太可能导致性能问题。有一些方法可以提高性能,但是使用枚举并不会对此做出贡献,而且也违背了ECS的目的。
https://gamedev.stackexchange.com/questions/71601
复制