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,应用二进制接口)是指应用程序与操作系统或其他程序…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...