首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有什么理由不让我的所有组件成为一个类吗?

有什么理由不让我的所有组件成为一个类吗?
EN

Game Development用户
提问于 2013-12-17 06:23:11
回答 1查看 336关注 0票数 2

对于实体/组件系统中的每个组件,使用通用的无所不包的Component类与特定的类(PositionComponentInputComponent等)会有什么不利之处?

我所说的“通用”是指:

代码语言:javascript
运行
复制
class Component {
  String name; // component name, like "position"
  Map<Key, Object> attribs; // Attributes like "x" and "y" stored here.  
}

其中“特定”组件可能是:

代码语言:javascript
运行
复制
class PositionComponent {
  int x, y;
}

我想为每个组件创建一个单独的类,这意味着我的代码库中有大量的3-5行类。

EN

回答 1

Game Development用户

回答已采纳

发布于 2013-12-17 06:40:13

在您提议的“泛型”组件方法中,有几件事情需要注意:

  • 这意味着组件是纯数据,并且不能有任何行为,除非您开始执行类似的操作,比如允许将行为对象(函数指针或什么东西)存储在attribs成员或类似的成员中。对于ECS来说,这是一种有效的可能方法,但并非所有ECS都选择“组件是纯数据”模型,而且它肯定不是唯一的方法。
  • 泛型组件将所有属性存储在字典中;这意味着查找字符串(或某种键)以恢复数据、装箱和非连续存储。关联容器还具有存储开销。所有这些都会对性能产生影响。你也在放弃类型安全。
  • 将名称存储为字符串(而不是能够从组件的类型直观)也意味着额外的开销。

就我个人而言,我从未见过像你在野外提出的任何真实的“通用组件”。这似乎是一个非常糟糕的选择,如果没有其他原因,仅仅是当您对组件进行了如此广泛的概括时,您最好通过使实体成为存储所有这些属性并命名空间它们的东西来减少开销:

代码语言:javascript
运行
复制
class Entity {
  Dictionary<string, object> components;
}

// ...

var entity = new Entity();
entity.components.Add("Position.X", 1.0f);
entity.components.Add("Position.Y", 2.0f);
entity.components.Add("Position.Z", 3.0f);
entity.components.Add("RigidBody.Mass", 100.0f);
entity.components.Add("Killable.HP", 15.0f);

(但我还是不推荐。)

票数 6
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/67485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档