当前位置: 首页 > news >正文

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

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)以对象为中心。在这种架构设计风格中,每种游戏对象包含一个类型定义,该类型定义包含游戏对象的属性及行为,游戏世界中的每一个游戏对象都是这些类型定义的一个实例。新增一个游戏对象类型可能需要新增一个类型定义。

相关文章:

  • 【ML】softmax简单理解。
  • 【IC前端虚拟项目】工程目录组织说明
  • ospf选路
  • git 常用部分方法
  • node.js出现version `GLIBC_2.27‘ not found的解决方案
  • Java 使用html2image将html生成缩略图图片
  • Liunx Centos 防火墙操作
  • ingress介绍和ingress通过LoadBalancer暴露服务配置
  • 第一百九十三回 滚动布局的使用示例
  • HTTP、HTTPS、SSL协议以及报文讲解
  • GO设计模式——13、享元模式(结构型)
  • MAC PHP版本安装问题
  • MySQL数据库从小白到入门(二)
  • 2023年5个自动化EDA库推荐
  • Elasticsearch 8.9 flush刷新缓存中的数据到磁盘源码
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • CSS中外联样式表代表的含义
  • Java程序员幽默爆笑锦集
  • Java基本数据类型之Number
  • Netty 4.1 源代码学习:线程模型
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • scala基础语法(二)
  • Spring核心 Bean的高级装配
  • Vue组件定义
  • 百度小程序遇到的问题
  • 闭包--闭包之tab栏切换(四)
  • 创建一个Struts2项目maven 方式
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 首页查询功能的一次实现过程
  • 微信开源mars源码分析1—上层samples分析
  • UI设计初学者应该如何入门?
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​水经微图Web1.5.0版即将上线
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #Linux(Source Insight安装及工程建立)
  • #微信小程序:微信小程序常见的配置传值
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (七)理解angular中的module和injector,即依赖注入
  • (四)模仿学习-完成后台管理页面查询
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (五)c52学习之旅-静态数码管
  • (五)MySQL的备份及恢复
  • (转)fock函数详解
  • (转)Oracle存储过程编写经验和优化措施
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .naturalWidth 和naturalHeight属性,
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .Net Memory Profiler的使用举例
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .Net下的签名与混淆
  • .sh
  • ::前边啥也没有