322

我一直在研究游戏引擎设计(特别关注 2d 游戏引擎,但也适用于 3d 游戏),并且对如何进行它的一些信息感兴趣。我听说现在许多引擎正在转向基于组件的设计,而不是传统的深层对象层次结构。

您是否知道有关此类设计通常如何实施的信息的任何良好链接?我已经看到了你的层次结构的演变,但我真的找不到更多的详细信息(他们中的大多数似乎只是说“使用组件而不是层次结构”,但我发现改变我的想法需要一些努力两个模型之间)。

任何好的链接或信息都将受到赞赏,甚至书籍,尽管此处的链接和详细答案将是首选。

4

8 回答 8

316

2013-01-07 更新如果您想看到基于组件的游戏引擎与(在我看来)卓越的反应式编程方法的完美结合,请查看V-Play 引擎。它很好地集成了 QTs QML 属性绑定功能。

我们在大学里对游戏中的 CBSE 进行了一些研究,这些年来我收集了一些材料:

游戏文学中的 CBSE:

  • 游戏引擎架构
  • Game Programming Gems 4:管理游戏实体游戏的系统
  • 游戏编程瑰宝5:基于组件的对象管理
  • Game Programming Gems 5:通用组件库
  • 游戏编程宝典6:游戏对象组件系统
  • 面向对象的游戏开发
  • Architektur des Kerns einer Game-Engine und Implementierung mit Java(德语)

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

如果您真的想知道阅读了哪些组件:基于组件的软件工程!他们将组件定义为:

软件组件是符合组件模型的软件元素,可以独立部署和组合,无需根据组合标准进行修改。

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

软件组件基础设施是一组交互的软件组件,旨在确保使用这些组件和接口构建的软件系统或子系统将满足明确定义的性能规范。

经过 2 年的CBSE 游戏经验后,我认为面向对象编程只是一条死胡同。记住我的警告,当你看到你的组件变得越来越小,更像是封装在组件中的函数,有很多无用的开销。改用函数响应式编程。还可以看看我的新博客文章(在写这篇文章时让我想到了这个问题:))关于为什么我从基于组件的游戏引擎架构切换到 FRP

游戏论文中的 CBSE:

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

于 2010-08-16T17:30:32.137 回答
9

似乎确实缺乏有关该主题的信息。我最近实现了这个系统,我发现了一个非常好的 GDC Powerpoint,它很好地解释了经常被遗忘的细节。该文档在这里:游戏对象组件架构的理论与实践

除了那个 Powerpoint,还有一些很好的资源各种博客。PurplePwny 有一个很好的讨论和一些其他资源的链接。Ugly Baby Studios围绕组件如何相互交互的想法进行了一些讨论。祝你好运!

于 2009-12-14T20:15:22.120 回答
7

虽然不是关于游戏引擎设计主题的完整教程,但我发现这个页面有一些关于游戏组件架构使用的很好的细节和示例。

于 2010-07-12T23:56:50.640 回答
5

它是开源的,可在http://codeplex.com/elephant 获得

有人制作了 gpg6 代码的工作示例,您可以在这里找到它:http ://www.unseen-academy.de/componentSystem.html

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

问候

于 2010-04-02T13:25:23.747 回答
4

我目前正在 GameDev.net 的许多(许多)线程中研究这个确切的主题,并发现以下两种解决方案是我将为我的游戏开发的很好的候选者:

于 2010-07-17T12:39:09.193 回答
4

我在最后一个学期研究并实施了游戏开发课程。希望此示例代码可以为您指明如何处理此问题的正确方向。

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;
};

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

于 2010-09-05T22:59:46.903 回答
1

在这种情况下,对我来说,组件听起来像是引擎的独立运行时部分,可以与其他组件同时执行。如果这是动机,那么您可能需要查看参与者模型和使用它的系统。

于 2009-12-14T14:41:17.713 回答
1

有趣的文...

我在 google 上进行了快速搜索,但一无所获,但您可能想查看一些评论 - 很多人似乎已经尝试过实现一个简单的组件演示,您可能想看看一些他们的灵感:

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

此外,评论本身似乎对如何编写这样的系统进行了相当深入的讨论。

于 2009-12-14T14:53:32.130 回答