游戏架构之面向对象模型和组件模型

1.概述:

在所有游戏性架构相关的内容中,运行时对象模型可能是最复杂的系统,并且不同的游戏引擎呈现出的差异极大。例如Unity3D提供的组件模型,虚幻引擎提供的面向对象继承模型,其他一些游戏则使用一种不同于两者的基于数据驱动的游戏对象模型。

这些不同的游戏对象模型之间呈现出很大的设计思维及使用上的差异,但是它们往往都提供或必须具备一些通用的功能,这些包括但不限于:

  1. 管理游戏对象的创建与销毁。许多游戏引擎都提供一种统一的动态创建、销毁游戏对象的方式,并管理游戏对象的内存及资源。比如Genius-X框架中使用createEntity()、removeEntity(entity)来动态创建、销毁一个游戏对象。但是在Cocos2dx中却不是通过统一的方式创建和销毁游戏对象它是使用每个Node的子类自己的构造函数来创建,并使一种特殊的方式管理内存。
  2. 联系底层游戏引擎。每个游戏对象要能够通过某种方式访问底层游戏引擎系统。例如能够渲染三角形网格、执行碰撞检测,对角色执行动画等。在Unity中可以通过添加一个底层引擎功能相关的组件(Compenent)来访问底层引擎系统。Cocos2dx的Node集成了物理模拟、动画、实时逻辑更新等接口。
  3. 实时模拟对象行为。游戏是一个高度实时的系统,游戏对象的状态、行为在每被都可能会随着时间发生变化,这需要一套高效的游戏对象更新机制。对象可能需要以特定的逻辑次序进行更新。此外,除了逻辑次序,游戏对象之间还可能存在依赖关系,要按照一定的次序更新。
  4. 定义新游戏对象类型。在开发过程中,随着游戏需求的改变和演进,游戏对象模型必须有足够的弹性,可以容易地加入新的对象类型。理想情况下,新的游戏类型应可以完全用数据驱动的方式定义,但是在实际情况中,大部分新增游戏类型都需要程序的参与。在Genius-x框架中,新的不同行为的组合类型可以通过修改数据文件来实现,而新的行为则可以通过脚本来实现,然后修改数据文件来添加新的行为。
  5. 唯一的对象标识符。游戏世界可能会包含成百上千的游戏对象,在运行时必须能够识别和找到想要的对象,这意味着每种对象需要有某种唯一标识符。例如在Cocos2d-x 中可以通过给一个 Node 指定一个字符串名称,然后通过字符串标识符查找一个个游戏对象。
  6. 游戏对象查询。除了上面按游戏唯一标识付查询游戏对家,引擎框架还需要些更高级的查询方式,例如找到某种类型的游戏对象,或者某个范围的敌人等。在面向组件或者属性的架构中,游戏对象是以组件/属性为单位存储的,很容易查找具有某个属性类型的游戏对象组合,并且这种查找游戏对象的方式对数据驱动更友好,笔者称之为面向类型编程。

除了上述提到的这些,运行时游戏对象模型还包括有限状态机,用于同一个网络内的对象复制、对象序列化和持久性存档等。 

2. 运行时游戏对象模型

不同的游戏引擎对运行时游戏对象模型有不同的设计,但是大多数游戏引擎采用的架构风格可以归为以下两类。
(1)以对象为中心。在这种架构设计风格中,每种游戏对象包含一个类型定义,该类型定义包含游戏对象的属性及行为,游戏世界中的每一个游戏对象都是这些类型定义的一个实例。新增一个游戏对象类型可能需要新增一个类型定义。

相关推荐

  1. 游戏架构面向对象模型组件模型

    2023-12-08 08:56:04       35 阅读
  2. 面向对象——设计模式

    2023-12-08 08:56:04       24 阅读
  3. 面向对象设计模式

    2023-12-08 08:56:04       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 08:56:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 08:56:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 08:56:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 08:56:04       18 阅读

热门阅读

  1. Nmap脚本的基础知识

    2023-12-08 08:56:04       32 阅读
  2. 52. govaluate使用

    2023-12-08 08:56:04       38 阅读
  3. C#使用Matrix类对Dicom图像的放缩

    2023-12-08 08:56:04       44 阅读
  4. LeetCode-15. 三数之和

    2023-12-08 08:56:04       43 阅读
  5. ElasticSearch中的分析器是什么?

    2023-12-08 08:56:04       38 阅读
  6. R语言进行正态分布检验

    2023-12-08 08:56:04       38 阅读
  7. Mongodb中的ObjectId

    2023-12-08 08:56:04       34 阅读
  8. 看图学源码之 CopyOnWriteArraySet源码分析

    2023-12-08 08:56:04       29 阅读
  9. ZooKeeper学习一

    2023-12-08 08:56:04       27 阅读
  10. iSoftBook、Jira、GitLab、TAPT研发管理平台的比较

    2023-12-08 08:56:04       48 阅读
  11. Caddy服务器快速上手

    2023-12-08 08:56:04       37 阅读
  12. 【Angular开发】Angular:2023年最佳实践

    2023-12-08 08:56:04       35 阅读
  13. 用c#实现记事本的功能

    2023-12-08 08:56:04       30 阅读
  14. KVM迁移

    2023-12-08 08:56:04       20 阅读