游戏引擎架构
工具链解决的问题:调和几种思维方式不同的人的平台。
Complicated Tool GUI
GUI
GUI 是图形用户界面的首字母缩写,即允许用户通过图形元素与电子设备(如计算机、笔记本电脑、智能手机和平板电脑)进行交互的界面。在人机交互方面,它是软件应用程序编程的重要组成部分,用用户友好的操作取代基于文本的命令。它的目标是为用户提供易于查找、理解和使用的决策点。换句话说,GUI允许您使用鼠标,笔甚至手指控制设备。
创建 GUI 是因为文本命令行界面复杂且难以学习。GUI 进程允许您单击或指向称为图标或小部件的小图片,并在设备上打开命令或功能,例如选项卡、按钮、滚动条、菜单、图标、指针和窗口。它现在是软件应用程序编程中以用户为中心的设计标准。
使用 GUI 的程序称为“GUI 程序”。该程序创建任务或功能的小图片,并等待用户与它们进行交互。用户控制何时以及如何使用它们。要选择功能,用户可以使用键盘、指针设备,例如鼠标、触摸板或触摸屏,具体取决于设备。
2种GUI模式
Immediate Mode 即时模式:直接把要的东西放在上面,简单快捷,但是扩展性是有限的,而且对于逻辑层的要求高。
Retained Mode 保留模式
把预先想要的东西设计成一个box然后等逻辑层来实现,扩展性强。
图形库(而不是客户端)保留要呈现的场景。
客户端对图形库的调用并不直接导致实际呈现,而是利用图形库管理的大量间接资源。
设计模式
Design Pattern - MVC 设计模式-MVC
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式透过对复杂度的简化,使程序结构更加直观。
MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制)。
MVP
MVP 是 MVC 的变种,其实是一种升级。要说 MVP 就要说说 MVC,在 MVC 中 Activity 其实是 View层级,但是通常在使用中 Activity即是View也是Controller,并没有将 View层 和 Controller层 进行分离, 耦合度大大提高,非常不利于项目的管理。这时候 MVP 就应运而生了。
在这个mvp中View与Model完全没有联系了,只靠Presenter来联系
MVP 把 Activity 中的 UI逻辑 抽象成 View接口,把 业务逻辑 抽象成 Presenter接口,Model类 还是原来的 Model。在 MVP 模式中 Activity 的功能就是响应生命周期和显示界面,具体其他的工作都丢到了 Presenter层 中进行完成,Presenter 其实是 Model层 和 View层 的桥梁。
mvvm
是Model-View-ViewModel的简写,是M-V-VM三部分组成。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,其中ViewModel将视图 UI 和业务逻辑分开,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。
MVVM采用双向数据绑定,view中数据变化将自动反映到viewmodel上,反之,model中数据变化也将会自动展示在页面上。把Model和View关联起来的就是ViewModel。ViewModel负责把Model的数据同步到View显示出来,还负责把View的修改同步回Model。
MVVM核心思想,是关注model的变化,让MVVM框架利用自己的机制自动更新DOM,也就是所谓的数据-视图分离,数据不会影响视图。
Serialization and Deserialization 序列化和反序列化
他把对象表示成一连串的字节,里面包含了对象的数据,对象的类型信息,对象内部的数据的类型信息等等。因此,序列化可以看成是为了把对象存储在磁盘上或者是从磁盘上读出来并重建对象而把对象扁平化的一种方式。反序列化是把对象从扁平状态转化成活动对象的相反的步骤。
打包
打包方法
text
最简单的打包方法,但是很实用。
Binary Files 二进制文件
二进制的内存需求更低
Assert Data Repeatance
资产引用是通过创建引用关系将冗余数据分离成资产文件并完成关联的一种方法。(就是把重复数据打包,用的时候直接应用就行)。
Build Variance by Data Inheritance 利用数据继承构造方差
数据继承:继承继承对象的数据,并允许对其数据结构中定义的数据进行重写赋值。
如何加载资产-反序列化
首先在读取数据的时候会一个一个拆分数据的语意,然后吧key,value,type放在一起生成一个Pair Tree
二进制不需要上面的步骤,一般在头部就存放了数据的位置等重要信息。
Asset Version Compatibility 资产版本兼容性
老的数据在新的版本的兼容性,也是一个重要的问题
解决方法:
Solve Compatibility by Version Hardcode 通过版本硬代码解决兼容性问题
加载资产:检查字段是否存在,然后加载数据。
保存资产:将所有数据写入资产文件,
通过版本号来判断是否存在没有的数据,然后塞入,如果用不上就不读就可以。
Solve Compatibility by Field UID 用字段UID解决兼容性问题
定义数据file时定义一个单调递增的uid就可以了。
How to Make a Robust Tools
如何提高游戏引擎的鲁棒性,做好undo&redo(撤销,重做)以及在crash后数据的保存等。
提供序列化命令实例的功能
将数据反序列化为命令实例。TData类型需要提供序列化和
反序列化接口。
How to Make Tool Chain
模式-基本元素
抽象世界原子类型的基本构造块:INT,Float,Double.
类型:使用原子类型表示复杂的数据结构。容器:数组,地图..。
schema在设计的时候要有被继承的关系,也要可以数据应用
schema的2种方法:
优缺点:
WYSIWYG
就是所见即所得的意思。
早期的工具链是一个独立的架构。
现在的工具链是直接放在整个引擎的架构之中,即在使用工具的过程中会直接调用游戏。
Play in Editor (PIE)
2种方法,一个是直接在编辑器中运行,另外一种是通过拷贝一份在运行。
第一种是比较简单,但是游戏模式可能会导致数据更改。
第二种,是用所用空间较大,但是比较适合商用的引擎。
Plugin插件
一种为现有计算机程序添加特定功能的软件组件。提供一个接口来实现用户自己的需求。