Games104——引擎工具链基础
总览

工具链
用户到引擎架构图

- 工具链是衔接不同岗位、软件之间的桥梁,比如美术与技术,策划与美术,美术软件与引擎本身等,有Animation、UI、Mesh、Shader、Logical 、Level Editor等等。一般商业级引擎里的工具链代码量是超过引擎Runtime的,可见工具链非常重要(但大家都不愿意干工具呢··)。

复杂的工具
界面GUI
图形用户界面GUI(Graphics User Interface)其实就是工具的操作界面
两种 GUI 实现方式:
- Immediate Mode:每次绘制时由游戏逻辑直接发出绘图命令。在帧之间不会存储场景模型,需要不间断发出指令。好处是直接、简单、快,坏处是扩展性差、更多的工作给到游戏逻辑,压力大。

- Retain Mode: 图形库将场景的模型存储在内存中。 如果需要绘制,图形库会将场景转换为一组绘图命令。如果不需要更新,就不用发出命令。好处是扩展性强,性能高、可维护性高,大部分游戏工具gui用这种,比如UE UMG、QT GUI等。

设计模式Design Pattern
当一个工具由几十上百个功能时,就需要遵循设计模式来规划了。
MVC:Model(管理应用数据)->View(信息归总表)->Controller(总结指令)->,路径是单向的,原始数据不会被弄脏。最经典,变种也最多的设计模式。

MVP:Presenter从model里取数据呈现给view,然后从view的用户交互里反馈给model。超大型软件工程中的unit test(单元测试)适用,代价是presenter会比较臃肿。

MVVM:与MVP相似但是用ViewModel代替Presenter,执行责任上用设计师代替开发人员,完全把view和model区分开。现代最常用,好处是独立开发、方便测试和复用,坏处是不太好迁移、debug困难、对简单ui需要overkill了。


在游戏引擎工具链中,需要有非常强的工程可扩展性,一定不要自己造轮子,选择最成熟的结构和方案。
数据的加载和存储
序列化(Serialization)和反序列化(Deserialization)其实就是save 和load,将游戏中的一些对象、数据转化成二进制块方便存储,也与后期的Network工作相关
存储形式:
- Text File:TXT、Json、YAML、XML。好处是易读,容易debug。比如unity用subset of YAML,Cryengine用XML或Json。引擎推荐首先支持此类

- Binary File:二进制,例如:UAsset(Unreal)、FBX Binary、unity Runtime等。好处是存储容量小,并且容易加密,安全性高。比如FBX Binary比FBX text占用小很多,同时还省去了语义的兼容过滤处理,总体加载速度能快10倍。因此上线产品一般用这种形式。
资产引用
在游戏中,很多东西会重复出现,为了节省内存,我们需要资产引用:只存储引用,通过引用实例化(Instance)重复对象(Prefab),这是资产系统和工具链最核心的底层逻辑。
- 对象实例化变体(Prefab与Prefab Variant)
通过复制的方式构建变体:复制原先数据并修改,但是比较低效并且丧失关联性。 - 通过数据继承(Data Inheritance)的方式构建变体:继承原数据并override。

资产加载Deserialization
资产解析Parse
- 资产树状结构

- 树状结构在text和二进制文件里的形式:

- Endianness字节端序,不同端口规则还不一样,做游戏平台适配时需要注意

资产版本兼容性(Compatibility)
很多软件都只做到向下兼容,那怎么做到向上兼容?—在元宇宙、分布式部署这类场景里非常需要
- Unreal :给资产添加版本号,对于高版本新增的数据类型,读取时添加这些类型的Default Value,对于新版本删除的数据类型,不进行读取。----老师认为这方法不好

- Google :给数据的每一个属性定义 UID,并且相对于上一个属性的 UID 是单调递增的;读取时UID不认识就跳过,没有的用默认值。

如何制作高鲁棒性的工具
鲁棒性(Robust)是指一个系统在面对错误输入、异常情况或意外事件时,仍能保持稳定性和可靠性的能力。
Undo & Redo、Crash Recovery
Command:记录用户所有操作(分解为多个Command)并记录

Command的定义:UID是唯一、累加的,用于记录执行顺序

Command的3种主要操作:Add创建、Delete、Update
如何制作工具链
各个工具如Animation、UI、Mesh、Shader、Logical 、Level Editor,如果全部单独写的话,那将没有任何扩展性。我们需要找到这些工具通用的部分,因为任何复杂的结构都可以由简单的building blocks构成,我们需要一个标准的语言去描述它们:Schema。
Schema
- Schema 结构的标准描述语言工具通用、可以生成标准ui;
- 比如圆定义为半径r,长方体定义为长宽高、曲线定义为key point等
- 可以数据继承
- 两种定义方式:
- file:好定义;但需要代码生成器,可能有版本问题,同时无法定义api
- code(UE):可以包装function等,支持性好;但对鲁棒性要求高
引擎数据的3种view
- 硬盘Runtime中:二进制或者text格式;在乎加载和运算速度
- 内存中:二进制;在乎写入速度和内存占用
- 工具中用户:需要更可理解的界面和多样的编辑模式

所见即所得
工具体系的核心精神:所见即所得,即工具是什么样运行时就是什么样(与运行环境配置一致)
-
Stand-alone Tools:早期可以独立运行的工具。好处是工具开发简单,但是难以做到所见即所得。现在基本不用了。
-
In Game Tools:直接在游戏引擎上做的工具。开发成本高,需要做复杂的ui,但完全in-game editing,对生产效率提升帮助巨大

-
Play in Editor(PIE):在编辑器里直接就能play(需要区分editor和play的数据,避免污染,但很难)或有PIE mode(类似沙盒,相当于做分身,更可靠)


可拓展性
将引擎作为一个平台,让用户可以用插件Plugin形式制作工具,比如unity商店。
那么引擎需要提供对应的 API ,比如增加按钮等,以增加引擎的可拓展性。

QA
工具链开发需要具备什么能力:对游戏制作和流程的基本理解(经验),软件工程能力、架构思维、设计师思维
工具链用web前端做的多不多:目前还不多,但随着h5越来越强大,未来有可能,因为底层逻辑很接近
协同编辑有没有很好的实现:基础理论已经成形,就是工程问题,5年内应该能解决
原文链接
相关文章:
Games104——引擎工具链基础
总览 工具链 用户到引擎架构图 工具链是衔接不同岗位、软件之间的桥梁,比如美术与技术,策划与美术,美术软件与引擎本身等,有Animation、UI、Mesh、Shader、Logical 、Level Editor等等。一般商业级引擎里的工具链代码量是超过…...
分层多维度应急管理系统的设计
一、系统总体架构设计 1. 六层体系架构 #mermaid-svg-QOXtM1MnbrwUopPb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QOXtM1MnbrwUopPb .error-icon{fill:#552222;}#mermaid-svg-QOXtM1MnbrwUopPb .error-text{f…...
【漏斗图】——1
🌟 解锁数据可视化的魔法钥匙 —— pyecharts实战指南 🌟 在这个数据为王的时代,每一次点击、每一次交易、每一份报告背后都隐藏着无尽的故事与洞察。但你是否曾苦恼于如何将这些冰冷的数据转化为直观、吸引人的视觉盛宴? 🔥 欢迎来到《pyecharts图形绘制大师班》 �…...
(二)QT——按钮小程序
目录 前言 按钮小程序 1、步骤 2、代码示例 3、多个按钮 ①信号与槽的一对一 ②多对一(多个信号连接到同一个槽) ③一对多(一个信号连接到多个槽) 结论 前言 按钮小程序 Qt 按钮程序通常包含 三个核心文件: m…...
【Linux】从硬件到软件了解进程
个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程(1)简述(2)系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…...
HTB:Alert[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ffuf对alert.htb域名进行子域名FUZZ 使用go…...
ARM嵌入式学习--第十天(UART)
--UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器,是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控…...
玉米苗和杂草识别分割数据集labelme格式1997张3类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1997 标注数量(json文件个数):1997 标注类别数:3 标注类别名称:["corn","weed","Bean…...
哈夫曼树
哈夫曼树(Huffman Tree)是一种最优的二叉树,常用于数据压缩,如在 Huffman 编码中使用。它是根据字符出现的频率来构造的,频率越高的字符越靠近树的根,频率低的字符则在较深的节点上。其核心思想是通过构建一…...
wax到底是什么意思
在很久很久以前,人类还没有诞生文字之前,人类就产生了语言;在诞生文字之前,人类就已经使用了语言很久很久。 没有文字之前,人们的语言其实是相对比较简单的,因为人类的生产和生活水平非常低下,…...
笔记:使用ST-LINK烧录STM32程序怎么样最方便?
一般板子在插件上, 8脚 3.3V;9脚 CLK;10脚 DIO;4脚GND ST_Link 19脚 3.3V;9脚 CLK;7脚 DIO;20脚 GND 烧录软件:ST-LINK Utility,Keil_5; ST_Link 接口针脚定义: 按定义连接ST_Link与电路板; 打开STM32 ST-LINK Uti…...
数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)
一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done....
Python在数据科学领域的深度应用:从数据处理到机器学习模型构建
Python在数据科学领域的深度应用:从数据处理到机器学习模型构建 在当今大数据与人工智能蓬勃发展的时代,Python凭借其简洁的语法、强大的库支持和活跃的社区,已成为数据科学家和工程师的首选编程语言。本文将深入探讨Python在数据科学领域的应用,从数据预处理、探索性分析…...
海外问卷调查渠道查,具体运营的秘密
相信只要持之以恒并逐渐掌握技巧,每一位调查人在踏上征徐之时都会非常顺利的。并在日后的职业生涯中拥有捉刀厮杀的基本技能!本文会告诉你如何做好一个优秀的海外问卷调查人。 在市场经济高速发展的今天,众多的企业为了自身的生存和发展而在…...
穷举vs暴搜vs深搜vs回溯vs剪枝系列一>单词搜索
题解如下 题目:解析决策树:代码设计: 代码: 题目: 解析 决策树: 代码设计: 代码: class Solution {private boolean[][] visit;//标记使用过的数据int m,n;//行,列char…...
万字长文深入浅出负载均衡器
前言 本篇博客主要分享Load Balancing(负载均衡),将从以下方面循序渐进地全面展开阐述: 介绍什么是负载均衡介绍常见的负载均衡算法 负载均衡简介 初识负载均衡 负载均衡是系统设计中的一个关键组成部分,它有助于…...
基于SpringBoot的青年公寓服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
经典游戏红色警戒2之英语
1. New construction options 部署新的建筑物(一般是部署基地车时说的)。 2. Loading 等待。(正在进行) 3. Construction complete 建筑完成。 4. On hold 等待。(暂停进行) 5. Canceled 取消。 6. Ca…...
IM 即时通讯系统-50-[特殊字符]cim(cross IM) 适用于开发者的分布式即时通讯系统
IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术,提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…...
QtCreator在配置Compilers时,有一个叫ABI的选项,那么什么是ABI?
问题提出 QtCreator在配置Compilers时,有一个叫ABI的选项,那么什么是ABI? ABI(Application Binary Interface)介绍 ABI(Application Binary Interface,应用二进制接口)是指应用程序与操作系统或其他程序…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
