Architecture 基于组件的游戏引擎设计

Architecture 基于组件的游戏引擎设计,architecture,game-engine,entity-component-system,entity-system,Architecture,Game Engine,Entity Component System,Entity System,我一直在研究游戏引擎设计(特别关注2d游戏引擎,但也适用于3d游戏),并且对如何进行的一些信息感兴趣。我听说现在很多引擎正在转向基于组件的设计,而不是传统的深层对象层次结构 你知道关于这些类型的设计通常是如何实现的,有什么好的链接吗?我已经看到了,但我真的找不到更多详细的信息(其中大多数似乎只是说“使用组件而不是层次结构”,但我发现在两个模型之间切换我的想法需要一些努力) 任何关于这方面的好链接或信息都将不胜感激,甚至是书籍,尽管这里的链接和详细答案将是首选 在这种情况下,组件对我来说就像引擎的

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

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


任何关于这方面的好链接或信息都将不胜感激,甚至是书籍,尽管这里的链接和详细答案将是首选

在这种情况下,组件对我来说就像引擎的独立运行时部分,可以与其他组件同时执行。如果这就是动机,那么你可能想看看利用它的系统和系统。

有趣的文章

我在google上快速搜索了一下,什么也没找到,但你可能想查看一些评论——很多人似乎都尝试过实现一个简单的组件演示,你可能想看看他们的一些评论,以获得灵感:




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

关于这个主题似乎确实缺乏信息。我最近实现了这个系统,我发现了一个非常好的GDC Powerpoint,它很好地解释了经常留下的细节。该文件如下:


除了Powerpoint,还有和。PurplePwny有一个很好的讨论和一些其他资源的链接。围绕组件如何相互作用的概念进行了一些讨论。祝你好运

它是开源的,可在

有人制作了gpg6代码的工作示例,您可以在这里找到:

或在此:


关于

虽然不是一个关于游戏引擎设计的完整教程,但我发现它有一些很好的关于游戏组件体系结构使用的细节和示例。

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


更新2013-01-07:如果您想看到基于组件的游戏引擎与(我认为)反应式编程的优越方法的良好结合,请查看。它很好地集成了QTs功能

我们在大学对CBSE游戏进行了一些研究,多年来我收集了一些资料:

游戏文献中的CBSE:

  • 游戏引擎架构
  • 游戏编程宝石4:一个管理游戏实体的系统
  • 游戏编程Gems 5:基于组件的对象管理
  • 游戏编程Gems 5:通用组件库
  • 游戏编程Gems 6:游戏对象组件系统
  • 面向对象的游戏开发
  • 麻省理工学院Java(德语)游戏引擎和实现器架构

C#中基于组件的游戏引擎的一个非常好且清晰的例子是

如果你真的想知道哪些组件是可读的:基于组件的软件工程! 它们将组件定义为:

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

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

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

在CBSE游戏公司工作两年后,我的观点是面向对象编程只是一条死胡同。记住我的警告,当您看到您的组件变得越来越小,越来越像组件中的函数,并且有很多无用的开销。改用。另外,请看一看我关于的最新博文(这篇博文在写作时引出了这个问题:)

CBSE在游戏报纸上的报道:

  • (404)
  • (网络档案)
CBSE游戏中的web链接(按相关性排序):

  • (空维基)
  • (404)
  • (网络档案)

我上学期研究并实施了一门游戏开发课程。希望此示例代码能够为您指明正确的方向,指导您如何处理此问题

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;
};
类实体{
公众:
实体(常量无符号int-id、常量std::string和enttype);
~Entity();
//组件接口
const Component*GetComponent(const std::string&family)const;
无效设置组件(组件*P);
void RemoveComponent(常量标准::字符串和族);
无效组件();
//属性接口
bool HasProperty(const std::string&propName)const;
模板T&GetPropertyDataPtr(const std::string&propName);
模板const T&GetPropertyDataPtr(const std::string&propName)const;
//实体接口
常量unsigned int GetID()常量;
无效更新(浮动dt);
私人:
void RemoveProperty(const std::string和propName);
void ClearProperties();
模板void AddProperty(const std::string和propName);