基于组件的游戏引擎devise

我一直在寻找游戏引擎devise(专注于二维游戏引擎,也适用于三维游戏),并对如何去做一些信息感兴趣。 我听说现在很多引擎正在转向基于组件的devise,而不是传统的深层对象层次结构。

你知道有关这些devise经常被实现的信息有什么好的联系吗? 我已经看到了你的层次结构的发展 ,但是我不能find更多的详细信息(其中大部分只是说“使用组件而不是层次结构”,但是我发现需要一些努力来改变我的想法两种模式之间)。

任何良好的链接或信息将不胜感激,甚至书籍,虽然这里的链接和详细的答案将是首选。

更新2013-01-07如果你想看看基于组件的游戏引擎与反应式编程(在我看来)优越的方法的好混合看看V-Play引擎 。 它很好地集成了QT的QML属性绑定function。

我们在我们大学的游戏中做了一些关于CBSE的研究,多年来我收集了一些资料:

CBSE在游戏文学:

  • 游戏引擎架构
  • 游戏编程gem4:Managin游戏实体游戏系统
  • 游戏编程gem5:基于组件的对象pipe理
  • 游戏编程gem5:通用组件库
  • 游戏编程gem6:游戏对象组件系统
  • 面向对象的游戏开发
  • Java(德语)游戏引擎和实施工具的架构

大象游戏框架是C#中基于组件的游戏引擎的一个非常好的和干净的例子。

如果你真的想知道什么组件被阅读:基于组件的软件工程! 他们将组件定义为:

软件组件是符合组件模型的软件组件,可以根据组成标准独立地部署和组合,而不需要修改。

组件模型 定义了特定的交互和组合标准。 组件模型实现是支持符合模型的组件执行所需的专用可执行软件组件集合。

软件组件基础结构是一组交互式软件组件,其devise用于确保使用这些组件和接口构build的软件系统或子系统将满足明确定义的性能规范。

CBSE的两年游戏经验中我的观点认为,面向对象的编程只是一个死路一条。 记住我的警告,因为你看着你的组件变得越来越小,更像function包装在组件中有很多无用的开销。 改用function性反应式编程 。 另外看看我的新博客文章(这导致我写这个问题时:))关于为什么我从基于组件的游戏引擎架构切换到FRP

游戏论文中的CBSE:

  • 基于组件的游戏开发 – 提高成本并扩大期限的解决scheme?
  • 电脑游戏的灵活和可扩展架构 (404)
  • 游戏的软件架构
  • 游戏开发的通用框架 (WebArchive)
  • 使用dependency injection的游戏对象的智能组成

游戏网页链接中的CBSE(按相关性sorting):

  • 基于组件的对象维基 (空维基)
  • 演变你的层次
  • 游戏对象结构:inheritance与聚合
  • 数据驱动的游戏对象系统(PDF)
  • 数据驱动的游戏对象系统(PPT)
  • 基于组件的Flash原型制作工具
  • 游戏对象组件体系结构的理论与实践 (404)
  • 实体系统是MMO的未来
  • ogre3d.org论坛:基于组件的对象
  • gamedev.net:舷外基于组件的实体系统体系结构
  • gamedev.net:实体系统问题
  • Brainfold实体系统博客 (WebArchive)

似乎缺乏关于这个问题的信息。 我最近实施了这个系统,我发现了一个很好的GDC Powerpoint,可以解释那些经常被遗忘的细节。 该文档在这里: 游戏对象组件体系结构的理论与实践

除了Powerpoint,还有一些很好的资源和各种博客 。 PurplePwny有一个很好的讨论,并链接到一些其他资源。 丑陋的婴儿工作室有一些关于组件如何相互作用的想法的讨论。 祝你好运!

虽然不是关于游戏引擎devise的完整教程,但是我发现这个页面有一些关于游戏组件体系结构使用的细节和例子。

它是开源的,可在http://codeplex.com/elephant上find

有人做了一个gpg6代码的实例,你可以在这里find它: http : //www.unseen-academy.de/componentSystem.html

或在这里: http : //www.mcshaffry.com/GameCode/thread.php?threadid=732

问候

我目前正在GameDev.net的许多(多个)主题中研究这个确切的主题,并发现以下两个解决scheme是我将为我的游戏开发的最佳人选:

  • 批评我的基于组件的实体系统
  • 舷外基于组件的实体系统架构 – > Lord_Evil的build议

我研究和实施了上个学期的游戏开发课程。 希望这个示例代码可以指导你如何处理这个问题的正确方向。

class Entity { public: Entity(const unsigned int id, const std::string& enttype); ~Entity(); //Component Interface const Component* GetComponent(const std::string& family) const; void SetComponent(Component* newComp); void RemoveComponent(const std::string& family); void ClearComponents(); //Property Interface bool HasProperty(const std::string& propName) const; template<class T> T& GetPropertyDataPtr(const std::string& propName); template<class T> const T& GetPropertyDataPtr(const std::string& propName) const; //Entity Interface const unsigned int GetID() const; void Update(float dt); private: void RemoveProperty(const std::string& propName); void ClearProperties(); template<class T> void AddProperty(const std::string& propName); template<class T> Property<T>* GetProperty(const std::string& propName); template<class T> const Property<T>* GetProperty(const std::string& propName) const; unsigned int m_Id; std::map<const string, IProperty*> m_Properties; std::map<const string, Component*> m_Components; }; 

组件指定行为并对属性进行操作。 所有组件之间通过引用共享属性,并免费获取更新。 这意味着消息传递没有很大的开销。 如果有任何问题,我会尽力回答。

在此上下文中,对我而言,组件听起来像是可以与其他组件同时执行的引擎的隔离运行时部分。 如果这是动机,那么你可能想看看演员模型和使用它的系统。

有趣的artcle …

我在Google上search过很快并没有发现任何东西,但是您可能需要查看一些评论 – 大量的人似乎已经实施了一个简单的组件演示,您可能需要查看一下他们的灵感:

http://www.unseen-academy.de/componentSystem.html
http://www.mcshaffry.com/GameCode/thread.php?threadid=732
http://www.codeplex.com/Wikipage?ProjectName=elephant

而且,评论本身似乎对你如何编写这样一个系统有相当深入的讨论。

Interesting Posts