十三、工具链:基础

13.1 工具链

image-20230801110208184

image-20230801111200754

工具链的任务:

  • 让不同思维方式的人,能够共同工作
  • 对于不同的人,打开同一个游戏,关注的侧重点、看到的形式都是不同的

image-20230801112950233

13.2 复杂的工具

13.2.1 GUI

image-20230801113437985

13.2.1.1 直接模式 Immediate Mode

直接由游戏逻辑绘制GUI

优点:简单易实现

缺点:难以扩展

image-20230801113541640

image-20230801113551192

13.2.1.2 Retained Mode

将要画的东西存储到一个buffer中,绘制时根据这些指令自动绘制

优点:将UI的逻辑和渲染划分开,扩展性好,性能高(绘制指令集中在一起)

image-20230801113756034

image-20230801113829936

13.2.2 设计模式

13.2.2.1 MVC

Model:数据

View:根据model进行渲染

Controller:修改model

image-20230801114027100

13.2.2.2 MVP

Model:数据

View:根据presenter的指令更新界面,并反馈给presenter用户事件

Presenter:从model中取数据,并更新model

image-20230801114237328

13.2.2.3 MVVM

Model:数据

ViewModel:由程序员编写,将view与对应的model绑定

View:由designer编写,表示交互逻辑

image-20230801114630997

image-20230801114700612

image-20230801141830204

13.2.3 Load & Save

13.2.3.1 序列化与反序列化

image-20230801142121940

13.2.3.2 Text文件

可以先支持将所有asset均存放为text文件,便于debug

image-20230801142612287

13.2.3.3 Binary文件

image-20230801142935327

13.2.4 Asset Reference

将重复的东西提取出来

image-20230801143205286

13.2.5 场景中的对象实例

image-20230801143336464

13.2.5.1 对象实例的变化

image-20230801143423688

13.2.5.2 数据继承

image-20230801143554748

13.3 资产加载–反序列化

13.3.1 解析 Asset 文件

image-20230801143918747

13.3.2 创建 Key-Type-Value 的树状结构

image-20230801144101782

13.3.3 Binary vs Text

Binary:将描述存储在文件头部

Text:由json库解析生成树,然后进行查找

image-20230801144311730

13.3.4 Endianness 大小端

image-20230801144500583

13.3.5 资产的版本兼容

image-20230801144734659

13.3.5.1 添加/删除字段

image-20230801145104800

  • 硬编码:通过检查版本号,多的数据不处理,少的数据写为默认值

image-20230801145136066

  • protocol buffer:定义每个数据时,生成一个unique ID,数据更新时比较ID是否有变化

image-20230801145306634

13.4 如何制作高鲁棒性的工具:Command

  1. 将用户的操作分解为很多个小的command,command要尽量原子化
  2. 将command定时存到磁盘上,系统崩溃时从磁盘上找这些command

image-20230801150124281

13.4.1 Command的定义

  • UID:唯一的、累加的
    • 隐含了时序信息
  • Data
  • Invoke():执行command
  • Revoke():回退command
  • Serialize():序列化,将command存到磁盘上
  • Deserialize():反序列化,从磁盘中读取command
    • 通常由TData自身提供标准的序列化和反序列化方法

image-20230801150323211

13.4.2 三种标准Command:增删改

image-20230801150810357

13.5 如何制作工具链

13.5.1 找到共同的building block

  • 任何复杂的事物,均可以描述成简单事物的集合

image-20230801151103241

13.5.2 Schema:一种描述结构

  • 定义不同building block的描述结构

image-20230801151206840

13.5.2.1 基础元素

image-20230801153152433

13.5.2.2 继承

image-20230801153225484

13.5.2.3 data reference

image-20230801153324595

13.5.2.4 2种定义方式

image-20230801153551935

image-20230801153615812

13.5.3 引擎数据的三种表现形式

image-20230801154026068

  • 内存中:数据要尽可能高效处理

image-20230801154036871

  • 存储中:尽可能节约存储空间、加快读写速率

image-20230801154123422

  • 工具中:要尽可能直观,容易理解

image-20230801154217195

image-20230801154239595

image-20230801154313786

13.6 WYSIWYG:所见即所得

What You See Is What You Get

13.6.1 Stand-alone Tools

将工具层隔离出来,防止工具链的复杂代码污染引擎

  • 难以实现”所见即所得“

image-20230801154605268

13.6.2 In Game Tools

将工具层构建在整个引擎之上,工具层直接调用引擎代码

  • 在编辑器中的东西和实际游戏中的东西是相同的

image-20230801154756403

image-20230801154930491

13.6.3 PIE:Player in Editor

  • player in editor world:直接在编辑器中运行游戏
  • player in PIE world:拷贝一份editor world,创建一个PIE world,然后在PIE world中运行游戏

image-20230801155013747

image-20230801155152737

image-20230801155311998

13.7 可扩展性:插件

13.7.1 Plug-in框架

image-20230801155619712

image-20230801155633462

13.7.2 添加Toolbar Button

image-20230801155655033