GAMES104-13:工具链:基础
十三、工具链:基础
13.1 工具链
工具链的任务:
- 让不同思维方式的人,能够共同工作
- 对于不同的人,打开同一个游戏,关注的侧重点、看到的形式都是不同的
13.2 复杂的工具
13.2.1 GUI
13.2.1.1 直接模式 Immediate Mode
直接由游戏逻辑绘制GUI
优点:简单易实现
缺点:难以扩展
13.2.1.2 Retained Mode
将要画的东西存储到一个buffer中,绘制时根据这些指令自动绘制
优点:将UI的逻辑和渲染划分开,扩展性好,性能高(绘制指令集中在一起)
13.2.2 设计模式
13.2.2.1 MVC
Model:数据
View:根据model进行渲染
Controller:修改model
13.2.2.2 MVP
Model:数据
View:根据presenter的指令更新界面,并反馈给presenter用户事件
Presenter:从model中取数据,并更新model
13.2.2.3 MVVM
Model:数据
ViewModel:由程序员编写,将view与对应的model绑定
View:由designer编写,表示交互逻辑
13.2.3 Load & Save
13.2.3.1 序列化与反序列化
13.2.3.2 Text文件
可以先支持将所有asset均存放为text文件,便于debug
13.2.3.3 Binary文件
13.2.4 Asset Reference
将重复的东西提取出来
13.2.5 场景中的对象实例
13.2.5.1 对象实例的变化
13.2.5.2 数据继承
13.3 资产加载–反序列化
13.3.1 解析 Asset 文件
13.3.2 创建 Key-Type-Value 的树状结构
13.3.3 Binary vs Text
Binary:将描述存储在文件头部
Text:由json库解析生成树,然后进行查找
13.3.4 Endianness 大小端
13.3.5 资产的版本兼容
13.3.5.1 添加/删除字段
- 硬编码:通过检查版本号,多的数据不处理,少的数据写为默认值
- protocol buffer:定义每个数据时,生成一个unique ID,数据更新时比较ID是否有变化
13.4 如何制作高鲁棒性的工具:Command
- 将用户的操作分解为很多个小的command,command要尽量原子化
- 将command定时存到磁盘上,系统崩溃时从磁盘上找这些command
13.4.1 Command的定义
- UID:唯一的、累加的
- 隐含了时序信息
- Data
- Invoke():执行command
- Revoke():回退command
- Serialize():序列化,将command存到磁盘上
- Deserialize():反序列化,从磁盘中读取command
- 通常由TData自身提供标准的序列化和反序列化方法
13.4.2 三种标准Command:增删改
13.5 如何制作工具链
13.5.1 找到共同的building block
- 任何复杂的事物,均可以描述成简单事物的集合
13.5.2 Schema:一种描述结构
- 定义不同building block的描述结构
13.5.2.1 基础元素
13.5.2.2 继承
13.5.2.3 data reference
13.5.2.4 2种定义方式
13.5.3 引擎数据的三种表现形式
- 内存中:数据要尽可能高效处理
- 存储中:尽可能节约存储空间、加快读写速率
- 工具中:要尽可能直观,容易理解
13.6 WYSIWYG:所见即所得
What You See Is What You Get
13.6.1 Stand-alone Tools
将工具层隔离出来,防止工具链的复杂代码污染引擎
- 难以实现”所见即所得“
13.6.2 In Game Tools
将工具层构建在整个引擎之上,工具层直接调用引擎代码
- 在编辑器中的东西和实际游戏中的东西是相同的
13.6.3 PIE:Player in Editor
- player in editor world:直接在编辑器中运行游戏
- player in PIE world:拷贝一份editor world,创建一个PIE world,然后在PIE world中运行游戏
13.7 可扩展性:插件
13.7.1 Plug-in框架
13.7.2 添加Toolbar Button
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 华风夏韵!
评论