我正在探索Go和实体组件系统。我了解ECS是如何工作的,我正试图复制ECS的文档,即http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
为了提高性能,文档建议使用每种组件类型的静态数组。也就是说,不是组件接口的数组(指针数组)。在Go中,这个问题是循环导入。
我有一个包ecs,其中包含实体、组件和系统类型/接口的定义以及EntityManager。另一个包ecs/components包含各种组件。显然,ecs/components包依赖于ecs。但是,要在EntityManager中声明特定组件的数组,ecs将依赖于ecs/components,因此创建了一个循环导入。
有办法避免这种情况吗?我知道通常一个高层系统不应该依赖于低层系统。我还想指出,对于我的目的来说,使用指针数组可能已经足够快了,但我对可能的变通方法(供将来参考)很感兴趣
谢谢你的帮助!
为了提高性能,文档建议使用每个的静态数组组件类型。
我只是想说我可能是盲人,但我ctrl+f + d并多次阅读该文档,但没有看到任何接近于此的东西。(当然,可以通过这种方式进行一些优化,例如避免缓存丢失,但我怀疑它是否会超过文书开销)。
对于您首先提出的问题,.
导入有一个简单的答案。任何带有类似import . "some/other/package"
的import语句的包都将把该包的内容视为自己的内容,忽略循环依赖关系。不要这样做
给每个组件一个公共接口意味着从一个基派生类与虚函数。这里引入了一些额外的开销。不要因此而反对这个主意,作为附加的开销很小,与由于简化而节省的开销相比对象。
它直接告诉你使用接口(好吧,c++的虚拟继承,但足够接近)。没关系,这是必要的。特别是如果你想要两个稍微不同的AI组件或其他东西,这是天赐之物。