与许多有抱负的设计师和程序员一样,我偶然发现了实体/组件系统设计,包括有关该主题的各种优秀文章以及一些有效的实施方案。而且,和许多其他人一样,我已经把它自己用来实施这样一个系统。
从概念上讲,实体是一个组件包,它只不过是一系列系统要处理的数据包。所以我认为Entity对象可用于保存与之关联的所有组件,但其他人的工作则另有说法。在我的所有研究中,似乎几乎普遍认为实体只不过是一个ID,你必须不惜一切代价避免陷入面向对象思维的陷阱。他们建议将组件存储在管理器中,而不是直接解决这种设计的优点。
两种设计,实体中保存的组件与经理中的组件不会产生相同的最终结果吗?如果我误解/遗漏某些东西,请告诉我。
答案 0 :(得分:1)
我绝不是实体组件系统的专家,但这是我对此主题的看法。
我认为你永远不应该直接访问组件。如果这样做,那么您的组件开始相互依赖,之后,当您决定要更改一个组件的行为时,所有其他依赖于您想要更改的组件的组件都必须得到修复。
为了避免这个问题,组件不应该彼此了解任何事情。他们每个人都有一份工作,应该只专注于那份工作。如果需要从另一个组件获取某些数据(例如,您可能需要位置数据),则应该向另一个系统询问数据,或者开发消息传递系统。
当然,一旦你真正开始编码,很难在100%的时间内遵守这条规则,但你明白了。
避免在实体中存储组件的另一个原因是速度。当组件包含在系统中时(所有类似组件都存储在一起),您可以快速处理大量组件。您有机会设置可以重用的任何数据,循环并处理每个组件,然后释放任何重用的数据。不仅如此,每个系统都可以(应该)在单独的线程上运行,这样您就可以轻松利用多个核心。
同样,在实践中,这并非总是100%正确,但这就是它的理论。
总之,在系统中而不是在实体中保留组件可以减少直接访问组件的诱惑,并允许在系统中进行批量更新。我希望这会有所帮助,如果您有任何疑问,请告诉我。