3

我正在探索 Go 和实体组件系统。我了解 ECS 的工作原理,我正在尝试复制似乎是 ECS 的首选文档,即http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

出于性能考虑,该文档建议使用每种组件类型的静态数组。也就是说,不是组件接口数组(指针数组)。Go 中的问题是循环导入。

我有一个包ecs,其中包含EntityComponentSystem类型/接口以及EntityManager的定义。另一个包ecs/components包含各种组件。显然,ecs/components包依赖于ecs但是,要在EntityManager中声明特定组件的数组,ecs将依赖于ecs/components,因此会创建循环导入。

有没有办法避免这种情况?我知道通常高级系统不应该依赖于低级系统。我还想指出,对于我的目的而言,使用指针数组可能足够快,但我对可能的解决方法感兴趣(供将来参考)

谢谢您的帮助!

4

1 回答 1

5

为了性能,文档建议使用每种组件类型的静态数组。

我刚开始说我可能是盲人,但我 ctrl+f'd 并多次阅读该文档,但没有看到任何接近的内容。(当然,在避免缓存未命中等方面可以通过这种方式进行一些优化,但我怀疑它是否超过了文书开销)。

您首先提出的确切问题(.导入)有一个简单的答案。任何带有 import 语句的import . "some/other/package"包都会将该包的内容视为它自己的内容,而忽略循环依赖。不要这样做

不幸的是,如果不合并包,您将无法做到这一点(我的意思是不使用接口)。不过不要害怕。您发布的文章在“实施细节”下明确说明了这一点。

为每个组件提供一个公共接口意味着从具有虚函数的基类派生。这引入了一些额外的开销。不要让这让您反对这个想法,因为与简化对象所节省的成本相比,额外的开销很小。

它直接告诉您使用接口(好的,C++ 虚拟继承,但足够接近)。没关系,有必要。尤其是如果你想要两个稍微不同的 AI 组件或其他东西,那真是天赐之物。

于 2014-06-09T20:28:16.250 回答