【问题标题】:ECS with Go - circular imports带有 Go 的 ECS - 循环导入
【发布时间】:2014-06-10 04:45:48
【问题描述】:

我正在探索 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,因此会创建循环导入。

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

感谢您的帮助!

【问题讨论】:

    标签: entity-system go


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2011-12-01
      • 2015-07-13
      • 2020-07-23
      • 2015-12-21
      • 2011-12-08
      • 2022-01-11
      • 1970-01-01
      • 2020-02-13
      相关资源
      最近更新 更多