ECS与Go - 循环进口

时间:2014-06-09 18:01:25

标签: entity-system go

我正在探索Go和Entity-Component-Systems。我理解ECS是如何运作的,我试图复制似乎是ECS的首要文件,即http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

为了提高性能,本文档建议使用每种组件类型的静态数组。也就是说,不是组件接口数组(指针数组)。 Go中的问题是循环导入。

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

  

为了提高性能,本文档建议使用每个静态数组   组件类型。

我只是开始说我可能是瞎子,但是我按住c +并且多次阅读该文档并且没有看到任何接近的内容。 (当然,对于诸如避免缓存未命中之类的事情,可以采用这种方式进行一些优化,但我怀疑它在任何方面都超过了文书的开销。)

您首先要问.导入问题的答案很简单。任何包含import . "some/other/package"等导入语句的包都会将该包的内容视为自己的内容,忽略循环依赖关系。 不要这样做

不幸的是,如果没有合并软件包,你就无法做到这一点(我的意思是不使用接口)。不过不要害怕。您明确发布的文章在"实施细节"。

下说明了这一点
  

为每个组件提供一个通用接口意味着从一个基础派生   具有虚函数的类。这引入了一些额外的   高架。不要让这让你反对这个想法,因为额外的   与由于简化相比节省的开销相比,开销很小   对象。

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