资源
- GAMES104-现代游戏引擎:从入门到实践_哔哩哔哩_bilibili
- GAMES104 - 现代游戏引擎入门必修课 (boomingtech.com)
- Piccolo 社区 - 游戏引擎爱好者的新家园 (piccoloengine.com)
- BoomingTech/Piccolo: Piccolo (formerly Pilot) – mini game engine for games104 (github.com)
- GAMES104:现代游戏引擎,从理论到实践 - 知乎 (zhihu.com)
课程
第十三节:引擎工具链基础
Outline of Tool Chains
Foundation of Tool Chains
-
What is Game Engine Tool Chains
什么是游戏引擎工具链
-
Complicated Tool GUI
复杂的工具 GUI
-
How to Load Asset -Deserialization
如何加载资产-反序列化
-
How to Make a Robust Tools
如何制作强大的工具
-
How to Make Tool Chain
如何制作工具链
-
What You See is What You Get
所见即所得
-
One More Thing - Plugin
还有一件事 - 插件
Applications & Advanced Topic
-
Common Game Production Workflow
常见的游戏制作工作流程
-
Common Editors
常见的编辑
-
Reflection
反射
-
Collaborative Editing
协作编辑
What is Game Engine Tool Chain
什么是游戏引擎工具链?
Layer Between Users and Engine Runtime
用户和引擎运行时之间的层。让用户更好地操作游戏引擎写游戏。
Bridge Between DCC Tools and Game Engine
DCC 工具和游戏引擎之间的桥梁
让游戏引擎能够读取用户使用各种工具创造的艺术资源。
Let Huge Different Mindset Users Work Together
让不同心态的用户共同合作
For Designers
对于设计师
-
lterate the gameplay quickly
快速迭代游戏玩法
-
Implement game logic prototype quickly even without programming
无需编程即可快速实现游戏逻辑原型
-
Edit massive data easily
轻松编辑海量数据
For Artists
对于艺术家
-
The quality of the result
结果质量
-
Convenient workflow
便捷的工作流程
-
What you see is what you get (WYSIWYG)
所见即所得 (WYSIWYG)
Complicated Tool GUI
复杂的工具 GUI
Graphics User interface (GUI)
图形用户界面 (GUl)
GUl is getting more and more complex
GUI 越来越复杂
-
Fast iteration
快速迭代
-
Separation of design and implementation
设计和实现分离
-
Reusability
可重用性
-
…
Immediate Mode
-
The client calls cause rendering of graphics objects to the display.
客户端调用导致图形对象渲染到显示器。
-
the data to describe rendering primitives is inserted frame by frame directly from the client into a command list.
描述渲染图元的数据直接从客户端逐帧插入到命令列表中
1 |
|
Characteristic
特点
-
Lightweight
轻量级
-
Procedural programming
程序化编程
-
Widgets don’t maintain any data or state
小部件不维护任何数据或状态
Pros
优点
-
Straightforward
直接
-
Simple
简单
-
Quick prototype
快速原型
Cons
缺点
-
Poor scalability
可扩展性差
-
Poor performance
性能差
-
Poor maintainability
可维护性差
Examples
示例
- Unity UGUI
- Omniverse GUl
- Piccolo GUl
Retained Mode
保留模式
-
The graphics library, instead of the client retains the scene to be rendered.
图形库,而不是客户端保留要渲染的场景。
-
The client calls into the graphics library do notdirectly cause actual rendering, but make useof extensive indirection to resources, managedby the graphics library.
客户端调用图形库不会直接导致实际渲染,而是利用图形库管理的大量间接资源。
1 |
|
Characteristic
特点
-
Object-oriented
面向对象
-
Widgets contain their own state and data
小部件包含自己的状态和数据
-
Draw widgets as needed
根据需要绘制小部件
-
Complicated effects (animation et.al.)
复杂效果(动画等)
-
Pros
优点
-
High scalability
高可扩展性
-
High performance
高性能
-
High maintainability
高可维护性
Cons
缺点
-
Complex for developers
对开发人员来说很复杂
-
Message queue / callbacks
消息队列 / 回调
-
Synchronization between GUI and application
GUI 和应用程序之间的同步
-
Design Pattern-MVC
用户借助 Controller 操作 Model,Model 更新 View 给用户看。
Invented by Trygve Reenskaug in 1978, to bridge the gap between the human user’s mental model and the digital model that exists in the computer.
由 Trygve Reenskaug 于 1978 年发明,用于弥合人类用户的心理模型与计算机中存在的数字模型之间的差距。
Model: The central component of the pattern, responsible for managing the dataof the application.
模型:模式的核心组件,负责管理应用程序的数据。
View: Any representation of information such as a chart, diagram or table.
视图:任何信息表示形式,例如图表、图解或表格。
Controller: Accepts input and converts it to commands for the model or view.
控制器:接受输入并将其转换为模型或视图的命令。
Design Pattern-MVP
The evolution of the MVC design pattern, wherein the controller is replaced by the presenter.
MVC 设计模式的演变,其中控制器被演示者取代。
不同于 MVC,这次使用双向箭头。
Model: An interface defining the data to be displayed or otherwise acted upon in the user interface.
模型:定义要在用户界面中显示或以其他方式执行的数据的接口。
View: A passive interface that displays data (the model) and routes user commands (events) to thepresenter to act upon that data.
视图:显示数据(模型)并将用户命令(事件)路由到演示者以对该数据执行操作的被动接口。
Presenter: Acts upon the model and the view. lt retrieves data from repositories (the model), andformats it for display in the view.
演示者:对模型和视图执行操作。它从存储库(模型)检索数据,并将其格式化以在视图中显示。
Design Pattern-MVVM
A variation of Model / View / Controller (MVC)
In MVVM,View is the responsibility of a designer rather than a classic developer.
在 MVVM 中,View 是设计师而非传统开发人员的职责。
The designer is generally a more graphical,artistic focused person, and does lessclassic coding than a traditional developer.
设计师通常更注重图形和艺术,与传统开发人员相比,他们较少进行传统编码。
View: using a WYSlWYG tool such as Dreamweaver, VS Blend and save as html/xaml , view state that MVC encodes in its View classes is not easy to represent.
View:使用 Dreamweaver、VS Blend 等所见即所得工具并保存为 html/xaml,MVC 在其 View 类中编码的视图状态不易表示。
Binding: bind View Data to the Model ,no more code in View classes.
Binding:将 View 数据绑定到 Model,View 类中不再有代码。
ViewModel-Model of View: The Model is very likely to have a data types that cannot be mapped directly to controls,ViewMlodel contains data-transformers that convert Model types into View types.
ViewModel-View 的模型:Model 很可能具有无法直接映射到控件的数据类型,ViewMlodel 包含将 Model 类型转换为 View 类型的数据转换器。
Pros
优点
-
Independent development
独立开发
-
Easy to maintain and test
易于维护和测试
-
Easy to reuse components
易于重用组件
Cons
缺点
-
For simple UI, MVVM can be overkill
对于简单的 UI,MVVM 可能有点过头了
-
Data-binding is declarative and harder to debug
数据绑定是声明性的,更难调试
Serialization and Deserialization
序列化与反序列化
Serialization is the process of translating a data structure or object state into a format that can be stored (for example, in a file ormemory data buffer) or transmitted (for example, over a computer network) and reconstructed later.
序列化是将数据结构或对象状态转换为可存储(例如,在文件或内存数据缓冲区中)或传输(例如,通过计算机网络)并在稍后重建的格式的过程。
Deserialization is the opposite operation,extracting a data structure from a series ofbytes.
反序列化是相反的操作,从一系列字节中提取数据结构。
Text Files
使用文本文档设计的对象数据结构。
- Save data as text files
- Example: TXT, Json, YAML, XML…
- Can read by common text editors
Engine applications:
- Unity Editor(optional): subset of YAML
- Piccolo: Json
- Cryengine: XML/Json (optional)
Binary Files
-
Save data as bytes stream
将数据保存为字节流
-
Need additional tools for read/write
需要额外的读/写工具
-
Example: UAsset, FBX Binary
示例:UAsset、FBX 二进制
Engine applications:
- Unity Runtime, Unity Editor (optional 可选)
- CryEngine (optional 可选)
- Unreal: UAsset
Storage Comparison -Text vs. Binary
存储比较 - 文本与二进制
文本可读性好但是占用空间大,读取速度慢。二进制体积小,性能好但是可读性差,不便于调试。
Asset Data Repeatance
资源数据重复
Meshes which in the red boxes are redundant data.
红框内的网格是冗余数据。
How do game developers solve the problem?
游戏开发者如何解决这个问题?
Asset Reference
资产引用
Assets Reference is a way to separate redundant data into asset files and complete association by establishing reference relationships.
资产引用是一种将冗余数据分离到资产文件中,通过建立引用关系完成关联的方式。
Object instance in Scene
场景中的对象实例
Data instance is a way to create a parent data that you can use as a base to make a wide variety of different children and can also be used directly.
数据实例是一种创建父数据的方法,您可以将其用作基础来制作各种不同的子数据,也可以直接使用。
Object instance Variance
对象实例变化
How to change the texture of Ground1 from stone to castle stone?
如何将 Ground1 的纹理从石头更改为城堡石头?
Build Variance by Copying
通过复制构建差异
Intuitive way: make a copy of instance data, modify the copy
直观的方式:复制实例数据,修改副本
-
add lots of reduntant data
添加大量冗余数据
Build Variance by Data Inheritance
通过数据继承构建差异
Data lnheritance: lnherit the data of the inherited object and allow overriding assignments to thedata defined in its data structure.
数据继承:继承继承对象的数据并允许覆盖其数据结构中定义的数据的分配。
How to Load Asset-Deserialization
如何加载资产反序列化
Parse Asset File
解析资产文件
How to know how to instantiate A or fields?——Store the type of A and fields
如何知道实例化 A 或字段?——存储 A 和字段的类型
Build Key-Type-Value Pair Tree
构建键-类型-值对树
Binary vs. Text
二进制与文本
Where to store the objects and fields type?
将对象和字段类型存储在哪里?
-
Text: store in asset
文本:存储在资产中
-
Binary: store in a table
二进制:存储在表中
Endianness
不同的硬件架构有不同的字节序。
Big Endian: begin with most significant byte end with least significant byte
大端序:以最高有效字节开始,以最低有效字节结束
Little Endian: begin with least significant byte end with most significant byte
小端序:以最低有效字节开始,以最高有效字节结束
Endianness vary among different processors
不同处理器的字节序各不相同
Processor | Endianness |
---|---|
PowerPC (PPC) | Big Endian |
Sun Sparc | Big Endian |
IBM S/390 | Big Endian |
Inel x86 (32 bit) | Little Endian |
Intel x86_64 (64 bit) | Little Endian |
ARM | Bi (Big / Little) Endian |
Unreal:
1 |
|
Asset Version Compatibility
资源版本兼容性
Add or Remove Field
添加或删除字段
origin class:
1 |
|
old data:
1 |
|
updated class 1
1 |
|
updated class 2
1 |
|
Solve Compatibility by Version Hardcode
通过版本硬编码解决兼容性问题
Unreal: add version to asset
Unreal:将版本添加到资产
-
Load asset: check if field exists then load data
加载资产:检查字段是否存在,然后加载数据
-
Save asset: write all data to asset file
保存资产:将所有数据写入资产文件
1 |
|
Solve Compatibility by Field UID
通过字段 UID 解决兼容性问题
Google protocol buffers:
Google 协议缓冲区:
unique number for field
字段的唯一编号
-
Every field has a unique number, never change the number.
每个字段都有一个唯一编号,永远不要更改该编号。
-
Serialization:
序列化:
-
For every field, generate a “key” (fixed size) according toits field number and type.
对于每个字段,根据其字段编号和类型生成一个“键”(固定大小)。
-
Store field data with key, key is stored in the first few bytes
使用键存储字段数据,键存储在前几个字节中
-
-
Deserialization:
反序列化:
-
Field not in schema but in data:key would not be recognized, skip the field.
字段不在架构中但在数据中:键将无法识别,跳过该字段。
-
Field in schema but not in data: set default value.
字段在架构中但不在数据中:设置默认值。
-
1 |
|
How to Make a Robust Tools
如何制作一个鲁棒的游戏引擎?
-
Undo & Redo
要有 Ctrl + Z 和 Ctrl + Y 的功能
-
Crash Recovery
程序崩溃时能够回档
Command
-
Abstract all user operations to atomic commands which can invoke, revoke and serialize, deserialize.
将所有用户操作抽象为可以调用、撤销、序列化、反序列化的原子命令。
Command-Definition
-
ICommand<TData> provide a basic abstraction of the command.
ICommand<TData> 提供命令的基本抽象。
-
Every system (which want to support undo/redo/crash recory …) needs to implement the system related commands inherantanced from lCommand<TData>.
每个系统(想要支持撤消/重做/崩溃恢复…)都需要实现从 lCommand<TData> 继承的系统相关命令。
1 |
|
Command-UID
Commands need strictly follow the sequence when recovery from disk
从磁盘恢复时命令需要严格遵循顺序
-
Monotonic increase over time
随时间单调增加
-
Unique identification
唯一标识
Command Serialize and Deserialize
命令序列化和反序列化
-
Provide functions to serialize command instance to data and deserialize data to command instance.
提供将命令实例序列化为数据和将数据反序列化为命令实例的函数。
-
TData type needs to provide serialize anddeserialize interface.
TData 类型需要提供序列化和反序列化接口。
Three key Commands
三个关键命令
-
Add
-
Data: Usually data is a copy of the runtime instance
通常数据是运行时实例的副本
-
Invoke: Create a runtime instance with data
使用数据创建运行时实例
-
Revoke: Delete the runtime instance
删除运行时实例
-
-
Delete
-
Data: Usually data is a copy of the runtime instance
通常数据是运行时实例的副本
-
Invoke: Delete the runtime instance
删除运行时实例
-
Revoke: Create a runtime instance with data
使用数据创建运行时实例
-
-
Update
-
Data: Usually data is the old and new values of the modified properties of the runtime instance andtheir property names
通常数据是运行时实例修改属性的新旧值及其属性名称
-
Invoke: Set the runtime instance property to the new value
将运行时实例属性设置为新值
-
Revoke: Set the runtime instance property to the old value
将运行时实例属性设置为旧值
-
How to Make Tool Chain
Various Tools for Different Users
-
Different viewes for different tools
不同工具有不同的视图
-
Each tool has it’s owner datastructure
每个工具都有其所有者数据结构
-
Same data may have different view for different user
同一数据可能对不同用户有不同的视图
Develop all Tools Seperately?
单独开发所有工具?
Simplest Way
最简单的方法
-
No Scalability
没有可扩展性
-
No maintainbility
没有可维护性
Find Common Building Blocks
寻找共同的构建块
Any complex structure is made up of simple structures, we just need a standard language to describe it.
任何复杂的结构都是由简单的结构组成的,我们只需要一种标准的语言来描述它。
Schema-A Description Structure
Schema-A 描述结构
A data schema is the formal description of the structures your system is working with.
数据模式是系统正在使用的结构的正式描述。
Standardizing the world description language
标准化世界描述语言
-
Unified the data processor
统一数据处理器
-
Normalized data between different tools
不同工具之间的标准化数据
-
Ability to automatically generate standardized Ul
能够自动生成标准化 UI
Schema-Basic Eements
Schema-基本元素
Abstraction of the basic building block of the world
世界基本构成块的抽象
-
Atomic Types: Int, Float, Double …
原子类型:Int、Float、Double…
-
Class Type: Use atomic types to present complex data structure
类类型:使用原子类型呈现复杂的数据结构
-
Containers: Array, Map
容器:Array、Map
Schema-Inheritance
Abstraction of the inheritance relationship of the world
世界继承关系的抽象
1 |
|
Schema-Data Reference
Abstract of the reference relationship of the world
世界引用关系的抽象
In the code, we need to read the data through the file path and instantiate it into the corresponding file class.
在代码中我们需要通过文件路径读取数据,并实例化成对应的文件类。
Schema - 2 Definition Ways
Standalone schema definition file
独立的架构定义文件
Pros
优点
-
Comprehension easily
易于理解
-
Low coupling
低耦合
Cons
缺点
-
Ease to mismatch between engine version and schema version
引擎版本和架构版本容易不匹配
-
Difficult to define function in the structure
难以在结构中定义函数
-
Need to implement complete syntax
需要实现完整的语法
Defined in code
在代码中定义
Pros
优点
-
Ease to accomplish Function reflection
易于实现函数反射
-
Natural support for inheritance relationships
自然支持继承关系
Cons
缺点
-
Difficult to understand
难以理解
-
High coupling
高耦合
Three Views For Engine Data
数据以三个形式存在:存储器中、运算器中,还要便于用户理解。
Runtime View
运行时视图
Focus:
重点:
-
Read at a faster speed
以更快的速度阅读
-
Calculate at a faster speed
以更快的速度计算
1 |
|
Storage View
Focus:
重点:
-
Write at a faster speed
写入速度更快
-
Occupies less hard disk space
占用更少的硬盘空间
1 |
|
Tools View
Focus:
重点:
-
More understandable form
更易理解的形式
-
The need for multiple editing modes
需要多种编辑模式
Other Point:
其他点:
Tool data does not generally exists. Usually, special processing is done when the UI interface is generated
工具数据一般不存在,通常在生成 UI 界面时进行特殊处理
Tools View - Understandable
比如,计算中使用弧度,但给用户一般使用角度。
Too View-Various Editor Nodes
Too View-各种编辑器节点
Different edit mode for groups with different needs
针对不同需求的群体提供不同的编辑模式
What You See is What You Get (WYSIWYG)
所见即所得
User Friendly for Artists
User Friendly for Designer
Stand-alone Tools
Stand-alone Tools is a kind of tool that canrun independently of the engine.
独立工具是一种可以独立于引擎运行的工具。将 Tool Layer 与其他层并列。
Pros
优点
-
Suitable for use as a DCC tool plug-in
适合用作 DCC 工具插件
-
Easy to start developing tools
易于上手开发工具
Cons
缺点
-
Difficult to achieve WYSIWYG
难以实现所见即所得
In Game Tools
In Game Tools is a kind of tool based on engineruntime system work.
游戏内工具 是一种基于引擎运行时系统工作的工具。将 Tool Layer 置于顶层。
Pros
优点
-
Access to all engine data directly
直接访问所有引擎数据
-
Easy to preview the game in the editor
易于在编辑器中预览游戏
-
Easy to make live in-game editing
易于进行实时游戏内编辑
Cons
缺点
-
Complex engine architecture
引擎架构复杂
-
Requires a complete engine Ul system to makethe editor Ul
需要完整的引擎 UI 系统才能制作编辑器 UI
-
When the engine is crashing, the tools become unusable as well
当引擎崩溃时,工具也会变得无法使用
In Game Tools-Editor Mode
游戏工具-编辑器模式
Editor Mode: Support to modify and preview scene data
编辑器模式:支持修改和预览场景数据(如 Unity 在运行时调试)
-
Real time preview of scene data modification
实时预览场景数据修改
-
Logic systems do not tick, so there are more hardware resources to display more scene details
逻辑系统不勾选,因此有更多的硬件资源来显示更多的场景细节
-
…
Play in Editor (PIE)
在编辑器中玩游戏 (PIE)
PIE: Directly play game in editor, no need to close editor and start game mode
PIE:直接在编辑器中玩游戏,无需关闭编辑器并启动游戏模式
-
Save loading time
节省加载时间
-
The continuity of creation is maintained
保持创作的连续性
-
Quickly test modifications
快速测试修改
-
…
Two implemation ways
两种实现方式
-
Play in editor world: Start gameplay systems tick in editor world and play in it
在编辑器世界中玩游戏:在编辑器世界中启动游戏系统并在其中玩游戏
-
Play in PIE world: Duplicate editor world to create a PlE world and play in it
在 PIE 世界中玩游戏:复制编辑器世界以创建 PlE 世界并在其中玩游戏
PIE Mode -Play in Editor World
PIE 模式 - 在编辑器世界中游戏
Pros
优点
-
Easy architecture tools layer
简单的架构工具层
-
Quick state change
快速状态更改
Cons
缺点
-
Game mode may cause data changes
游戏模式可能导致数据更改
Example
示例
- Piccolo
PIE Mode -Play in PIE World
PIE 模式 - 在 PIE 世界中游戏
Pros
优点
-
Data separation
数据分离
-
Easy to instantiate multiple game instances Cons
易于实例化多个游戏实例
Cons
缺点
-
Architecture complex
架构复杂
Example
- Unreal
One More Thing - Plugin
还有一件事 - 插件
游戏引擎开发者不可能顾虑到所有可能的游戏开发情况,允许插件扩展游戏引擎的功能。
Extensibility
可扩展性
Different games need different customization of engine tools.
不同的游戏需要对引擎工具进行不同的定制。
Engine tools use plug-in mechanism to satisfy the needs.
引擎工具使用插件机制来满足需求。
Plug-in-Showcases
Plug-in - Framework
Plug-in : A software component that adds a specific feature to an existing computer program.
插件:为现有计算机程序添加特定功能的软件组件。
PluginManager: Manage plugin loading and unloading.
PluginManager:管理插件的加载和卸载。
Interface: A series of abstract classes provided to plug-ins, plug-ins can choose to instantiate different classes to realize the development of corresponding functions.
Interface:提供给插件的一系列抽象类,插件可以选择实例化不同的类来实现相应功能的开发。
API: A series of functions exposed by the engine, plug-ins can use functions to execute the logic what we want.
API:引擎暴露出来的一系列函数,插件可以使用这些函数来执行我们想要的逻辑。
Plug-in-Add a Toolbar Button
插件-添加工具栏按钮
Plug-in -Add a Plug-in Menu in Unreal5
Plug-in-Summary
插件概述
The meaning of plug-in framework
插件框架的意义
-
Extend editor functionality
扩展编辑器功能
-
Ease to hot update as decoupling
解耦,方便热更新
-
Facilitate the construction of engine development ecology
方便引擎开发生态的构建
Plug-in framework requirements
插件框架要求
-
Full API support
完整的 API 支持
-
Common interface support
通用接口支持
References
参考文献
-
Tools Tutorial Day: A Tale of Three Data Schemas, Ludovic Chabant, GDC2018:https://media.contentapi.ea.com/content/dam/eacom/frostbite/files/gdc18-tools-tutorial-day-a-tale-ofthree-data-schemas.pptx
-
Creating a Tools Pipeline for ‘Horizon: Zero Dawn’, Dan Sumaili, Sander van der Steen, GDC 2017.https://www.guerrilla-games.com/media/News/Files/GDc2017_Sumaili_VanDerSteen_CreatingAToolsPipelineForHorizonZeroDawn.pdf
-
Unreal Engine UProperties: https://docs.unrealengine.com/5.0/en-US/unreal-engine-upropertiesCommand
-
Pattern: https://www.tutorialspoint.com/design_pattern/command_pattern.htm
-
Unreal Plugins: https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/Plugins
-
Model-view-controller: https://en.wikipedia.org/wiki/Model–view–controller
-
Trygve Reenskaug: https://en.wikipedia.org/wiki/Trygve_Reenskaug
-
MVC: https://folk.universitetetioslo.no/trygver/themes/mvc/mvc-index.html
-
Benefits and Drawbacks of MVC Architecture: https://shreysharma.com/benefits-and-drawbacks-of-mvc-architecture/
-
Model-view-presenter: https://en.wikipedia.org/wiki/Model–view–presenter
-
Model-view-viewmodel: https://en.wikipedia.org/wiki/Model–view–viewmodel
第十四节:引擎工具链高级概念与应用
Glance of Game Production
游戏制作概览
whether to work on the environment, the animation, to place characters or to create missions.
是在环境,动画中工作,放置角色还是创建任务
Adapt to Different Game Genres
适应不同的游戏类型
Challenges from Real Production
真实游戏开发中的挑战。
在游戏开发中:
-
Massive various data from DCC and engine tools
大量来自 DCC 和发动机工具的各种数据
-
Artist, designer and programmer with different mindsets
艺术家,设计师和具有不同心态的程序员
-
WYSIWYG is must for highquality production
所见即所得,必须高质量生产
World Editor-A hub for everything to build the world
世界编辑 - A Hub供所有建立世界的枢纽
Unreal 为游戏开发者提供的界面。
Editor Viewport: A Special Version of Game Engine
编辑器视口:游戏引擎的特殊版本
-
Main window of interaction between designers and game world
设计师与游戏世界之间的互动主窗口(便于设计师 Debug 用的互动窗口)
-
Powered by a full game engine in special "editor” mode
由特殊“编辑”模式的完整游戏引擎提供动力
-
Provides a variety of special gadgets and visualizers for editing
提供各种用于编辑的特殊小工具和可视化器
WARNING: Editor-only code must be moved out of released game!
警告:仅编辑代码必须从发布的游戏中移出!
Everything is an Editable Object
一切都是一个可编辑的对象
-
The editing requirements of all objects in the editor world are mostly the same, such as moving, adjusting parameters, etc
编辑世界中所有对象的编辑要求大多是相同的,例如移动,调整参数等
Different Views of Objects
对象的不同视图
-
Display all of the objects within the scene
显示场景中的所有对象
-
Organize objects in different views for user conveniences
在不同视图中组织对象的用户便利
Schema-Driven Object Property Editing
模式驱动的对象属性编辑
-
Displays all of the editable properties for the selected objects
显示所选对象的所有可编辑属性
-
Beyond schema, we can define some customized editing utilities for different types
除了模式之外,我们还可以为不同类型的对象定义一些自定义的编辑实用程序
Content Browser
内容浏览器
-
Provide intuitive thumbnail of all assets
提供所有资产的直观缩略图
-
Share asset among different projects
在不同项目之间共享资产
-
Evolution of asset management from static file folder to content “ocean”
资产管理从静态文件夹演变为内容“海洋”
Editing Utilities in World Editor
世界编辑器中的编辑实用程序
便于用户编辑游戏对象的图示。
Mouse Picking
鼠标拾取
Ray Casting
射线投射
Pros:
-
No cache required
无需缓存
-
Can support multiple objects on selected rays
可以支持选定射线上的多个对象
Cons:
-
Poor query performance
查询性能较差
RTT
Pros:
-
Easy to implement range queries
易于实现范围查询
-
Ability to complete queries quickly
能够快速完成查询
Cons:
-
Need to draw an extra picture
需要绘制额外的图片
-
Obstructed objects cannot be selected
无法选择被遮挡的物体
Object Transform Editing
游戏引擎要便于用户对 Object 作 Transform Editing。
Terrain
Landform
地形
-
Height map
高度图
Appearance
外观
-
Texture map
纹理图
Vegetation
植被
-
Tree instances
树木实例
-
Decorator distribution map
装饰器分布图
Height Brush
高度画笔
-
Draw height map to adjust terrain mesh
绘制高度图以调整地形网格
-
Height change needs to be natural and smooth
高度变化需要自然流畅
-
Can be easily adjusted to the desired results
可以轻松调整到所需效果
-
Customized brush
自定义画笔
-
-
Instance Brush
实例画笔(给地标种树)
Pros:
-
Instance position is fixed
实例位置固定
-
Available to further modification
可进一步修改
Cons:
-
Large amount of data
数据量大
Environment
环境
-
Sky
天空
-
Light
灯光
-
Roads
路
-
Rivers
河流
-
…
From up to down, environment around us present a live world to the player. Edit these environment elements would also be important.
从上到下,我们周围的环境为玩家呈现了一个生动的世界。编辑这些环境元素也很重要。
Environment - Rule System
有了这些规则更好地让用户创建合理的地形环境。
Rules:
规则:
-
Tree will not grow beside objects.
树不会在物体旁边生长。
-
Tree will not grow in water.
树不会在水中生长。
-
Tree will not grow on roads.
树不会在道路上生长。
Conclusion:
结论:
-
Rule system handling data changes.
规则系统处理数据变化。
-
Decoupled Environment systems.
解耦环境系统。
Editor Plugin Architecture
编辑器插件架构
Examples of Plug-in Module in Commercial Softwares
商业软件中的插件模块示例
A Cross Matrix between Systems and Objects
系统与对象之间的交叉矩阵
Any system and object type could be plug-ins to Editors
任何系统和对象类型都可以成为编辑器的插件
Combination of Multiple Plugins
多种插件架构
Covered
覆盖
-
Only execute the newly registered logic, skip the original logic
仅执行新注册的逻辑,跳过原始逻辑
-
Ex. Terrain editing overwrite
例如地形编辑覆盖
Distributed
分布式
-
Each plugin will be executed, and if there is an output, the results will eventually be merged
每个插件都会被执行,如果有输出,结果最终会被合并
-
Ex. Most special system editing seperately
例如大多数特殊系统都是单独编辑的
Pipeline
管道
-
Input and output are connected to each other, generally input and output are the same data type
输入和输出相互连接,通常输入和输出是相同的数据类型
-
Ex.Asset preprocessing, geometry for physics
例如资产预处理、物理几何
Onion rings
洋葱圈
-
On the basis of the pipeline, the core logic of the system is in the middle, and the plug-in pays attention to the logic of entering and exiting at the same time
在管线的基础上,系统的核心逻辑在中间,插件同时关注进入和退出的逻辑
-
Ex. Road editing plugin with terrain plugin
Ex. 道路编辑插件与地形插件
One More Thing-Version Control
还有一件事-版本控制
A certain version relationship is required between the plug-in and the host application to ensure that they can work together normally.
插件和宿主应用之间需要有一定的版本关系,才能保证它们能够正常协同工作。
-
Plug-in use the same version number with the host application
插件使用与宿主应用相同的版本号
-
Plug-in use the version number of the plug-in interface
插件使用插件接口的版本号
-
This is more recommended because the update frequency of the plug-in interface and thesoftware may be different
这是比较推荐的做法,因为插件接口和软件的更新频率可能不一样
-
Design Narrative Tools
设计叙述工具
Storytelling in Game Engine
游戏引擎中的故事叙述
Control many parameters variance in the timeline
控制时间轴中的许多参数变化
Sequencer
序列发生器(做动画的软件里常有)
-
Track: ln order to reference actors in your sequence. Any character, prop, camera, effect, or othelactors can be referenced and manipulated in Sequencer
轨道:为了引用序列中的演员。任何角色、道具、摄像机、效果或其他演员都可以在 Sequencer 中引用和操纵
-
Property Track: Property of reference actors in track
属性轨道:轨道中引用演员的属性
-
Timeline: A line describing time in discrete frames
时间轴:描述离散帧中时间的线
-
Key Frame: The key fames can manipulate properties. Upon reaching a key frame in the timeline the track’s properties are updated to reflect the values you have defined at that point
关键帧:关键帧可以操纵属性。到达时间轴中的关键帧后,轨道的属性将更新以反映您在该点定义的值
-
Sequence: Sequencer’s data
序列:Sequencer 的数据
Sequencer-Bind Objects to Track
序列器-将对象绑定到跟踪
How to let the sequencer control my “chick”
如何让音序器控制我的“小鸡”
-
Bind the “chick” to Track
将“小鸡”绑定到轨道
Sequencer-Bind Object Property to Property Track
Sequencer-将对象属性绑定到属性轨道
How to control the moving position of the “chick”
如何控制“小鸡”的移动位置
-
Bind position property toproperty track
将位置属性绑定到属性轨道
Sequencer-Set Key Frame
Sequencer-设置关键帧
How to make an “chick” reach a specified position
如何让“小鸡”到达指定位置
Sequencer-Set Key Frames
序列器设置关键帧
A, B, C, D are key frames.
A、B、C、D 是关键帧。
How “chick” go from A to B to C to D
“小鸡”如何从 A 到 B 再到 C 再到 D
Sequencer-Interpolate Properties along Key Frames
Sequencer-沿关键帧插入属性
Similar to animation, set key frames
与动画类似,设置关键帧
Reflection and GamePlay
Reflection is Foundation of Sequencer
反射是 Sequencer 的基础
Any data in game engine can be bind into track based on reflection system
游戏引擎中的任何数据都可以根据反射系统绑定到轨道中
Complexity of Game Play
Visual Scripting System
可视化编程系统,如蓝图。
Hard Code Method for More Feature
硬编码方法实现更多功能,但是代码也更复杂。
1 |
|
1 |
|
A Common Solution - Reflection
常见解决方案 - 反射
In computer science, reflective programming or reflection is the ability of a process to examine, introspect and modify its own structure and behavior.
在计算机科学中,反射编程或反射是指进程检查、自省和修改自身结构和行为的能力。
现在高级的语言编程都有反射的设计。
JAVA Reflection
1 |
|
1 |
|
Reflection Build the Bridge between Code and Tools
反射在代码和工具之间搭建桥梁
Using reflection to generate a code meta information map
使用反射生成代码元信息图
-
class_name, func_name and para_name
-
generate accessor and invoker
生成访问器和调用器
1 |
|
1 |
|
How to Implement Reflection in C++
如何在 C++ 中实现反射
-
Collect type info from code
从代码中收集类型信息
-
Generate code to provide accessors for fields and methods
生成代码以提供字段和方法的访问器
-
Manage all accessors with a <string,accessor> map
使用 <string,accessor> 映射管理所有访问器
How to Get Type Info from Code
如何从代码中获取类型信息
General Programming Language (GPL) Compilation Process
通用编程语言 (GPL) 编译过程
Abstract Syntax Tree (AST): An abstract representation of the syntax structure of source code. It represents the syntax structure of programming language in the form of a tree, and each node in the tree represents a construct in the source code.
抽象语法树(AST):源代码语法结构的抽象表示。它以树的形式表示编程语言的语法结构,树中的每个节点代表源代码中的一个构造。
Why Piccolo Use Clang
One of Clang’s main goals is to provide a library-based architecture, so that the compiler could interoperate with other tools that interact with source code.
Clang 的主要目标之一是提供基于库的架构,以便编译器可以与其他与源代码交互的工具进行互操作。
Generate Schema From AST
从 AST 生成模式
-
Parsing AST, such as type name, field name, field type, etc
解析 AST,例如类型名称、字段名称、字段类型等
-
Build a temporary schema of data in memory
在内存中构建数据的临时模式
Precise Control of Reflection Scope
精确控制反射作用域
In the actual scenario, we need to add a lot of tag information to identify the purpose of the type.
实际场景中,我们需要添加很多标签信息来标识类型的用途。
Use Marco to Add Reflection Controls
使用 Marco 添加反射控件
Add tags by __attribute__
通过 __attribute__ 添加标签
-
__attribute__ is a source code annotation provided by clang. In the code, the required data types can becaptured by using these macros.
__attribute__ 是 clang 提供的源代码注释,在代码中可以通过这些宏来捕获需要的数据类型。
-
Define a “CLASS” macro to distinguish between precompile and compile.
定义一个 “CLASS” 宏来区分预编译和编译。
-
When precompiling, define “__REFOECTION_PARSER__” macro in meta parser to make_the attribute information effective
预编译时,在 meta parser 中定义“__REFOECTION_PARSER__”宏,使属性信息生效
-
Reflection Accessors
反射访问器
Generate reflection accessors using schemas
使用模式生成反射访问器
-
For classes, we need to generate type info getters
对于类,我们需要生成类型信息获取器
-
For fields, we need to generate setters and getters that can access them
对于字段,我们需要生成可以访问它们的设置器和获取器
-
For functions, we need to generate invoker that can invoke tem
对于函数,我们需要生成可以调用 tem 的调用器
Code Rendering
代码渲染
The same type of business code structure is the same.
同类型的业务代码结构都是一样的。
Code Rendering
代码渲染
Code Rendering is the process of collecting data (if any) and loading related templates (or sending output directly). The collected data is then applied to the associated template. The final output is sent to the user.
代码渲染是收集数据(如果有)并加载相关模板(或直接发送输出)的过程。然后将收集的数据应用于相关模板。最终输出将发送给用户。
Pros:
优点
-
Strong separation of code and data
代码和数据完全分离
Code Rendering-Mustache
代码渲染-Mustache
Mustache is a web template system.
Mustache 是一个 Web 模板系统。
It is named “Mustache” because of heavy use of braces, {{}}
, that resemble a sideways moustache.
它被命名为“Mustache”,因为它大量使用了括号 {{}}
,类似于侧胡子。
Use Mustache to Code Generation
使用 Mustache 进行代码生成
-
Implementing business logic using mustache templates
使用 Mustache 模板实现业务逻辑
-
Generate code through mustache rendering
通过 Mustache 渲染生成代码
Collaborative Editing
协作编辑
一个游戏开发项目可能需要多个人来协作编辑。
Bottlenecks in Large Projects
大型项目的瓶颈
-
Lots of people work with lots of assets
许多人使用大量资产
-
Assets version management is very difficult
资产版本管理非常困难
Merging Conflicts is The Biggest Problem
合并冲突是最大的问题
-
Everyone needs to spend a lot of time on merging conflicts when updating or uploading assets
每个人在更新或上传资产时都需要花费大量时间解决合并冲突
How to Reduce Conflicts
如何减少冲突
-
Split assets into smaller parts to reduce the probability of conflicts
将资产拆分成更小的部分以减少冲突的可能性
-
Layering the world
分层世界
-
Divide the world
划分世界
-
One file per actor (OFPA)
每个演员一个文件 (OFPA)
-
-
All people work in the same scene to completely eliminate the conflict
所有人都在同一个场景中工作以完全消除冲突
Split Assets-Layering the World
拆分资产 - 分层世界
-
Split the world into many layers, each of which is stored in an asset file
将世界拆分成多个层,每个层都存储在资产文件中
-
Different people work at different levels
不同的人在不同的层面上工作
Pros
-
Appropriate layers would decrease edit confliction
适当的层会减少编辑冲突
-
Layer-based logic available
提供基于层的逻辑
Cons
-
Layer logic may dependents on another layer
层逻辑可能依赖于另一层
-
Difficult to reasonably split layers when the world is very complex
当世界非常复杂时,很难合理地拆分层
Split Assets- Divide the World
分割资产 - 划分世界
-
The world is divided into fixed size blocks, and each block is saved in an asset file
世界被划分为固定大小的区块,每个区块都保存在资产文件中
-
Different people work at different blocks
不同的人在不同的区块工作
Pros
-
Location based splitting makes it easy to dynamically expand the world
基于位置的分割使动态扩展世界变得容易
-
Space separating is more intuitive to operator
空间分离对操作员来说更直观
Cons
-
Difficult to deal with objects across multiple blocks
难以处理跨多个块的对象
One File Per Actor
每个 Actor 一个文件
A splitting method proposed by unreal5
unreal5 提出的一种拆分方法
-
reduces overlap between users by saving data for instances of Actors in external files, removing the need to save the main Level file when making changes to its Actors
通过将 Actor 实例的数据保存在外部文件中来减少用户之间的重叠,无需在更改 Actor 时保存主关卡文件
-
All Actors are embedded in their respective Level files when cooked
烘焙后,所有 Actor 都嵌入到各自的关卡文件中
A Special Way to Split Assets-OFPA
资产分割的特殊方法-OFPA
Pros
-
Fine-grained scene division, fewer edit confliction
场景划分细粒度,编辑冲突更少
-
Only need to save objects modified
只需保存修改的对象
Cons
-
Massive files to manage, more burden for version control
需要管理大量文件,版本控制负担更重
-
Cook will be slow down while embedding many OFPA files to level file
将许多 OFPA 文件嵌入关卡文件时,Cook 速度会变慢
Coordinate Editing in One Scene
在一个场景中协调编辑
Connect multiple instances of world editor together to work collaboratively in a shared editing session, building a single virtual world together with your teammates and colleagues in real time.
将多个世界编辑器实例连接在一起,在共享编辑会话中协同工作,实时与您的队友和同事一起构建一个虚拟世界。
How to Synchronize My Operations with Others
如何将我的操作与他人同步
Do you remember command system?
你还记得命令系统吗?
-
Serialize my commands and send them to server
序列化我的命令并将其发送到服务器
-
Receive commands from server and deserialize them
从服务器接收命令并反序列化它们
-
Invoke commands
调用命令
There is A Very Big Challenge
有一个非常大的挑战
How to ensure the consistency of distributed operations?
如何保证分布式操作的一致性?
Two Users Cannot Edit The Same instance at The Same Time
两个用户不能同时编辑同一个实例
Instance lock: Avoid multiple people modifying the same instance at the same time
实例锁:避免多人同时修改同一个实例
Two Users Cannot Edit The Same Asset at The Same Time
两个用户不能同时编辑同一资产
Asset lock: Avoid multiple people modifying the same asset at the same time
资产锁定:避免多人同时修改同一资产
But Lock is not Omnipotent
If there are three users working in the same world, and now User2 presses the undo button, what do we expect to happen? lf he presses the redo button next?
如果有三个用户在同一个世界中工作,现在用户 2 按下了撤消按钮,我们期望发生什么?如果他接下来按下重做按钮?
How to Solve These Problems Thoroughly
如何彻底解决这些问题
Operation Transform (OT): Abstract the operation into an operation sequence consisting of an enumerable N atomic operation types
操作转换 (OT):将操作抽象为由可枚举的 N 个原子操作类型组成的操作序列
Conflict-free Replicated Data Type(CRDT): A data structure that is replicated across multiple computers in a network, with the following features:
无冲突复制数据类型 (CRDT):在网络中的多台计算机上复制的数据结构,具有以下特点:
-
The application can update any replica independently, concurrently and without coordinating with otherreplicas
应用程序可以独立、并发地更新任何副本,而无需与其他副本协调
-
An algorithm (itself part of the data type) automatically resolves any inconsistencies that might occur
算法(本身是数据类型的一部分)会自动解决可能发生的任何不一致问题
-
Although replicas may have different state at any particular point in time, they are guaranteed to eventually converge
虽然副本在任何特定时间点可能具有不同的状态,但它们最终会收敛
Traditional Workflow vs. Collaborative Editing Workflow
传统工作流程与协作编辑工作流程
Server is the Most Important Role
服务器是最重要的角色
Client
客户端
-
Crash
崩溃
-
Maloperation
操作不当
Server
服务器
-
Crash
崩溃
-
The server retains each session untithe user who createdthe session
expressly deletes it, or until the server itself is shut down.服务器保留每个会话,直到创建会话的用户明确删除它,或直到服务器本身关闭。
-
Save session records to disk
将会话记录保存到磁盘
References
-
C++ Reflection, Austin Brunkhorst, 2016: https://austinbrunkh.com/cpp-reflection-part-1/
-
Reflective programming: https://en.wikipedia.org/wiki/Reflective_programming
-
Unreal Blueprints Visual Scripting: https://docs.unrealengine.com/5.0/en-US/blueprints-visual-scripting-in-unreal-engine/
-
Unreal Engine UProperties:https://docs.unrealengine.com/5.0/en-US/unreal-engine-uproperties/
-
GPU-Based Run-Time Procedural Placement in "Horizon: Zero Dawn’, Jaap van Muijden, GDC2017: https://www.gdcvault.com/play/1024700/GPU-Based-Run-Time-Procedural
-
Ray casting: https://en.wikipedia.org/wiki/Ray_casting
-
Level (video games): https://en.wikipedia.org/wiki/Level_(video_games)
-
Unreal One File Per Actor:https://docs.unrealengine.com/5.0/en-US/one-file-per-actor-in-unreal-engine/
-
Uses of layers in Unity:https://docs.unity3d.com/Manual/use-layers.html
-
Unreal World Partition: https://docs.unrealengine.com/5.0/en-US/world-partition-in-unreal-engine/
-
How Figma’s multiplayer technology works, Evan Wallace, 2019: https://www.figma.com/blog/how-figmas-multiplayer-technology-works/
-
Unreal Multi-User Editing:https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/MultiUserEditing/
-
Conflict-free Replicated Data Types, Marc Shapiro,Nuno Preguica, Carlos Baquero, Marek Zawirski, 2011:https://pages.lip6.fr/Marc.Shapiro/papers/RR-7687.pdf
-
Operational Transformation Frequently Asked Questions andAnswers: https://www3.ntu.edu.sg/scse/staff/czsun/projects/otfaq/
-
Unreal Sequencer Overview:https://docs.unrealengine.com/4.27/en-US/AnimatingOequencer/Overview/
-
Unity Timeline: https://docs.unity3d.com/Packages/com.unity.timeline@1.7/manual/index.html
-
Plug-in (computing):https://en.wikipedia.org/wiki/Plug-in_(computing)