我一直在研究游戏引擎设计(特别是专注于2D游戏引擎,但也适用于3D游戏),对如何实现它很感兴趣。我听说现在许多引擎都采用组件化设计而不是传统的深层次对象层级。
您是否知道有哪些好的链接提供这些设计通常如何实现的信息?我看过evolve your hierarchy,但我真的找不到更多详细信息的链接(大多数似乎只是说“使用组件而不是层级”,但我发现在两种模型之间转换思维需要花费一些精力)。
任何关于此的好链接或信息都将不胜感激,即使是书籍,但首选链接和详细答案。
我一直在研究游戏引擎设计(特别是专注于2D游戏引擎,但也适用于3D游戏),对如何实现它很感兴趣。我听说现在许多引擎都采用组件化设计而不是传统的深层次对象层级。
您是否知道有哪些好的链接提供这些设计通常如何实现的信息?我看过evolve your hierarchy,但我真的找不到更多详细信息的链接(大多数似乎只是说“使用组件而不是层级”,但我发现在两种模型之间转换思维需要花费一些精力)。
任何关于此的好链接或信息都将不胜感激,即使是书籍,但首选链接和详细答案。
2013年1月7日更新:如果您想看到一个良好混合组件式游戏引擎和(在我看来)优越的反应式编程方法,请查看V-Play引擎。它非常好地集成了QT的QML属性绑定功能。
我们在大学进行了一些关于游戏中CBSE的研究,我在这些年里收集了一些材料:
游戏中的CBSE文献:
C#中一个非常好且干净的组件式游戏引擎示例是Elephant游戏框架。
如果您真的想知道组件是什么,请阅读:基于组件的软件工程!他们将组件定义为:
软件组件是符合组件模型的软件元素,可以根据组合标准独立部署和组合而无需修改。
组件模型定义了特定的交互和组合标准。组件模型实现是支持符合该模型的组件执行所需的专用可执行软件元素集。
软件组件基础设施是一组相互作用的软件组件,旨在确保使用这些组件和接口构建的软件系统或子系统将满足明确定义的性能规格。
在使用CBSE进行游戏开发2年后,我的看法是面向对象编程已经走到了死胡同。当您的组件变得越来越小,并且更像是打包了许多无用开销的函数时,请记住我的警告。请改用函数式反应式编程。还可以看看我最新的博客文章(写这篇文章的时候,我就是因为它才看到了这个问题 :)):为什么我从组件式游戏引擎架构转向FRP。
游戏中的CBSE论文:
按相关性排序的游戏CBSE网站链接:
关于这个主题似乎缺乏信息。我最近实施了这个系统,发现一份非常好的GDC幻灯片对通常被忽略的细节进行了很好的解释。该文档在此处:游戏对象组件架构的理论与实践
除了那个幻灯片外,还有一些好资源和各种博客。PurplePwny进行了良好的讨论并链接到其他一些资源。Ugly Baby Studios围绕组件如何相互交互的想法进行了一些讨论。祝你好运!
这是一个开源项目,可以在http://codeplex.com/elephant找到。
有人制作了gpg6-code的工作示例,您可以在http://www.unseen-academy.de/componentSystem.html或http://www.mcshaffry.com/GameCode/thread.php?threadid=732找到。
致意
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;
};
组件指定行为并对属性进行操作。属性通过引用在所有组件之间共享,并且可以免费更新。这意味着没有传递消息的大量开销。如有任何问题,我将尽力给出最佳答案。
有趣的文章...
我在Google上快速搜索了一下,但没有找到任何东西。你可能想检查一些评论 - 许多人似乎尝试着实现一个简单的组件演示,你可能想看看他们的一些作品以获得灵感:
此外,评论本身似乎对如何编写这样的系统进行了相当深入的讨论。http://www.unseen-academy.de/componentSystem.html
http://www.mcshaffry.com/GameCode/thread.php?threadid=732
http://www.codeplex.com/Wikipage?ProjectName=elephant