实体组件系统中的乞丐



我只是让自己深入了解实体组件系统并喜欢这个想法。我已经了解了它背后的基础知识,但细节是大多数问题隐藏的地方。所以我想知道是否有人可以帮助我克服它?

  1. 实体组件结构应该是什么?我已经看到了两种实现它的方法 - 将实体作为对象/结构,并在内部具有变量。其次,具有组件的数组或映射,其中映射中的数组或 int 的索引表示实体的 ID。哪种方式更好?

  2. 如果第一种方法将实体作为合法对象更好,那么我应该如何找到具有系统特定组件的实体?我是否应该遍历每个实体,然后遍历它的组件数组,以确定它是否具有此特定组件?相同的逻辑可以应用于具有不同组件的映射,因为我再次需要遍历映射以查找它是否具有特定的 id。

  3. 如果第二种带有数组的方法是正确的,那么如果我有一个像"PlayerController"这样的组件,它只分配给一个实体,但仍然会有这些组件的整个数组(只是空值,但那些也占用 64 位(。以防万一 - 我需要整个数组作为数组中项目的索引,实际上是表示实体 id 的内容,所以我需要至少具有此组件的实体 id 大小的数组,但由于泛化,我也可能比这大

令人惊讶的是,如此美丽的建筑在网上没有太多信息,只有图书馆(和教程(,如果你想深入了解这些库,你必须研究这些信息。

对于数据类型 - 字典/表格/结构是最好的。对象确实会阻碍您,因为您可能会想将系统级函数变成帮助程序函数。以后可能会回来咬你。要使用表构建实体,有一个使用组合/原型轻松地将实体拼接在一起的概念。

存储方法在很大程度上取决于您的语言。如果它可以从缓存优化中受益,其中数据存储在连续的内存块中,那就很重要了。但是,对于使用"魔术"指针构建在上面的C++/Java 和 lang,它们将不会从缓存优化中受益(我使用 Lua,这只是人们在 reddit 上告诉我的(。这些表本身是连续的,但不一定彼此连续。所以这并不重要。

如果你可以控制内存分配,那么你必须权衡单一的优点/缺点 -

  • 集中式实体存储查找组件所需的开销较少,因为它们位于同一实体表中。但是,每个系统的循环都需要从if component == true语句开始,以确定它是应该对实体进行操作还是跳过它。不过,如果很便宜。

  • 分散式实体存储不需要 if 检查,因此系统永远不会浪费时间检查不需要它们关注的实体。但是,更新其他阵列中的(共同(依赖组件会产生额外的开销,因为系统必须搜索更长的时间才能找到所需的内容。此开销会随着依赖项的增加而增加,因此使组件尽可能独立是最佳做法(但并不容易(。您可以通过将相互依赖的组件转换为较大组件(例如表(的子组件来解决此问题。

无论哪种方式,您都必须分析您的代码。如果大多数实体具有大多数组件,则集中式方法更好。对于组件差异很大的实体,分散式方法更加灵活。最终,选择你更舒服的东西。

为了回答你的第三个要点(如果我理解的话(,你只在去中心化模型中存储有用的信息。假设您有一个玩家和 19 个敌人,并且该玩家有一个"玩家输入"组件。玩家将被输入到玩家输入组件表中,玩家输入系统将查看一个组件表,其中包含一个玩家条目以传递输入。你不需要 19 个空值,这违背了去中心化的观点。或者,您可以创建一个"输入"系统来处理控制器输入和 AI 输入,但两者可以是单独的系统。这取决于你。

最新更新