游戏开发中的基于组件的架构

Posted

技术标签:

【中文标题】游戏开发中的基于组件的架构【英文标题】:Component Based Architecture in game development 【发布时间】:2011-11-29 04:56:10 【问题描述】:

我一直在考虑尝试基于组件的架构来进行游戏开发。我已经阅读了一些关于它的博客文章和文章,但我还有一些事情还没有整理出来。当我说基于组件时,我的意思是您可以将组件添加到 ComponentManager 以更新其列表中的所有组件。我想尝试这样做以避免获得继承它们不需要的变量和函数的类。我真的很喜欢拥有一个非常简单的实体类的想法,其中有很多组件并排工作而不会变得臃肿。此外,它很容易在运行时删除和添加功能,这真的很酷。

这就是我的目标。

// this is what the setup could be like
entity.componentManager.add(new RigidBody(3.0, 12.0));
entity.componentManager.add(new CrazyMagneticForce(3.0));
entity.componentManager.add(new DrunkAffection(42.0, 3.0));

// the game loop updates the component manager which updates all components
entity.componentManager.update(deltaTime);

通信:部分组件需要与其他组件通信

我不能依靠组件来自我维持。有时他们需要与其他组件进行通信。我该如何解决这个问题?在 Unity 3D 中,您可以使用 GetComponent() 访问组件。

我想这样做,但是如果你有两个相同类型的组件会发生什么?也许你会得到一个向量。

var someComponent : RigidBody = _componentManager.getComponent(RigidBody);

优先级:某些组件需要先于其他组件更新

某些组件需要先于其他组件更新才能获得当前游戏循环的正确数据。我正在考虑为每个组件添加一个优先级,但我不确定这是否足够。 Unity 使用 LateUpdate 和 Update,但也许有一种方法可以更好地控制执行顺序。

嗯,就是这样。如果您有任何想法,请随时发表评论。或者,如果你有任何关于这方面的好文章或博客,我很乐意看看它们。谢谢。

Component based game engine design

http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


编辑: 我的问题实际上是如何解决组件之间的优先级和通信问题。

【问题讨论】:

好的——但是你的问题是什么? 我想就组件之间的通信和优先级问题获得意见。我将编辑问题以澄清。谢谢 【参考方案1】:

我选择了一个RDMBS组件实体系统http://entity-systems.wikidot.com/rdbms-with-code-in-systems#objc

到目前为止,它运行得非常好。每个组件只保存数据,没有方法。然后我有处理组件并执行实际工作的子系统。有时一个子系统需要与另一个子系统通信,为此我使用服务定位器模式http://gameprogrammingpatterns.com/service-locator.html

至于优先级。每个系统都在我的主游戏循环中处理,因此首先处理哪个系统只是一个问题。所以对于我来说,我处理的是控制,然后是物理,然后是相机,最后是渲染。

【讨论】:

感谢您的回答。我还有很多事情要弄清楚,但你让我朝着正确的方向前进。 @Mattias 不用担心。是的,我发现很多关于组件实体系统的文献都忽略了很多细节。最后,我只是阅读了我能读到的所有内容,并想出了一些对我有意义的东西。我希望有一天能写一篇关于它的文章。我真的认为组件实体系统是游戏开发的必经之路,所以希望你也觉得它值得:) @Allan 我正在研究 RDMBS 方法。每个“系统”搜索与系统的组件标准匹配的实体。这不是超级低效吗?不包括找到的每个实体,我们必须再次搜索我们想要使用的组件。是否有更有效的解决方案,或者我们必须进行一系列字典查找,并为每次更新创建数组?我以这个代码库为例:[link]github.com/adamgit/Game--Escape-from-the-Pit/blob/master/… @terry franguiadakis - RDMBS 方法在设计时并未考虑到最佳速度,但折衷是值得的。在实践中,对性能的影响可以忽略不计。事实上,对于游戏,至少有 50% 的时间用于渲染。对于我的测试,带有查找功能的实体系统只花费了总时间的 1% 左右。为了确保最佳性能,我使用了两个字典,一个是在调用 getAllComponentsOfType() 时确保快速检索,另一个是用于快速 getComponent()

以上是关于游戏开发中的基于组件的架构的主要内容,如果未能解决你的问题,请参考以下文章

游戏开发经验总结:分布式架构数据库与进程设计

雷电飞机大战游戏|基于Java开发实现雷电飞机大战游戏

雷电飞机大战游戏|基于Java开发实现雷电飞机大战游戏

游戏引擎架构入门

unity ECS简介

蓝鸥Unity开发基础三课时2 游戏对象和基本操作