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

你知道关于这类设计通常是如何实现的信息的任何好的链接吗?我已经看到了层次结构的演进,但我真的找不到更多详细的信息(其中大多数似乎只是说“使用组件而不是层次结构”,但我发现在两种模型之间转换我的思想需要一些努力)。

任何好的链接或信息,这将是感激,甚至书籍,尽管链接和详细的答案在这里将是首选。


当前回答

更新2013-01-07:如果你想看到一个基于组件的游戏引擎和(在我看来)反应式编程的优秀方法的良好组合,可以看看V-Play引擎。它很好地集成了QTs QML属性绑定功能。

我们在大学里对游戏中的CBSE做了一些研究,我收集了一些材料:

游戏文献中的CBSE:

游戏引擎架构 游戏编程宝石4:一个管理游戏实体的系统 游戏编程精华5:基于组件的对象管理 游戏编程宝石5:通用组件库 游戏编程精华6:游戏对象组件系统 面向对象的游戏开发 Java游戏引擎和实施者(德语)

大象游戏框架是c#中基于组件的游戏引擎的一个很好的例子。

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

A software component is a software element that conforms to a component model and can be independently deployed and composed without modification according to a composition standard. A component model defines specific interaction and composition standards. A component model implementation is the dedicated set of executable software elements required to support the execution of components that conform to the model. A software component infrastructure is a set of interacting software components designed to ensure that a software system or subsystem constructed using those components and interfaces will satisfy clearly defined performance specifications.

在经历了2年的CBSE游戏开发经验后,我认为面向对象编程是一条死胡同。请记住我的警告,因为您看到您的组件变得越来越小,越来越像组件中的函数,有很多无用的开销。使用函数式响应式编程。也可以看看我最近的博客文章(这篇文章让我想到了这个问题:)关于为什么我从基于组件的游戏引擎架构转向了FRP。

游戏论文中的CBSE:

基于组件的游戏开发——解决不断增加的成本和不断扩大的截止日期? 灵活且可扩展的电脑游戏架构(404) 游戏的软件架构 游戏开发的通用框架(WebArchive) 使用依赖注入的游戏对象的智能组合

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

Component based objects Wiki (Empty wiki) Evolve Your Hierachy Game Object Structure: Inheritance vs. Aggregation A Data-Driven Game Object System (PDF) A Data-Driven Game Object System (PPT) Component-based prototyping tool for flash Theory and Practice of Game Object Component Architecture (404) Entity Systems are the Future of MMOs ogre3d.org forum: Component Based Objects gamedev.net: Outboard component-based entity system architecture gamedev.net: Entity System question Brainfold entity-system blog (WebArchive)

其他回答

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

更新2013-01-07:如果你想看到一个基于组件的游戏引擎和(在我看来)反应式编程的优秀方法的良好组合,可以看看V-Play引擎。它很好地集成了QTs QML属性绑定功能。

我们在大学里对游戏中的CBSE做了一些研究,我收集了一些材料:

游戏文献中的CBSE:

游戏引擎架构 游戏编程宝石4:一个管理游戏实体的系统 游戏编程精华5:基于组件的对象管理 游戏编程宝石5:通用组件库 游戏编程精华6:游戏对象组件系统 面向对象的游戏开发 Java游戏引擎和实施者(德语)

大象游戏框架是c#中基于组件的游戏引擎的一个很好的例子。

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

A software component is a software element that conforms to a component model and can be independently deployed and composed without modification according to a composition standard. A component model defines specific interaction and composition standards. A component model implementation is the dedicated set of executable software elements required to support the execution of components that conform to the model. A software component infrastructure is a set of interacting software components designed to ensure that a software system or subsystem constructed using those components and interfaces will satisfy clearly defined performance specifications.

在经历了2年的CBSE游戏开发经验后,我认为面向对象编程是一条死胡同。请记住我的警告,因为您看到您的组件变得越来越小,越来越像组件中的函数,有很多无用的开销。使用函数式响应式编程。也可以看看我最近的博客文章(这篇文章让我想到了这个问题:)关于为什么我从基于组件的游戏引擎架构转向了FRP。

游戏论文中的CBSE:

基于组件的游戏开发——解决不断增加的成本和不断扩大的截止日期? 灵活且可扩展的电脑游戏架构(404) 游戏的软件架构 游戏开发的通用框架(WebArchive) 使用依赖注入的游戏对象的智能组合

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

Component based objects Wiki (Empty wiki) Evolve Your Hierachy Game Object Structure: Inheritance vs. Aggregation A Data-Driven Game Object System (PDF) A Data-Driven Game Object System (PPT) Component-based prototyping tool for flash Theory and Practice of Game Object Component Architecture (404) Entity Systems are the Future of MMOs ogre3d.org forum: Component Based Objects gamedev.net: Outboard component-based entity system architecture gamedev.net: Entity System question Brainfold entity-system blog (WebArchive)

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

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……

我在谷歌上快速搜索了一下,没有发现任何东西,但是你可能想要检查一些评论-很多人似乎已经尝试了实现一个简单的组件演示,你可能想要看看他们的一些灵感:

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

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

我目前正在GameDev.net上的许多帖子中研究这个确切的话题,并发现以下两个解决方案是我将为自己的游戏开发的良好候选方案:

批评我的基于组件的实体系统 外部基于组件的实体系统架构——> Lord_Evil的建议