当前位置: 首页 > news >正文

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工作相关
存储形式:

  1. Text File:TXT、Json、YAML、XML。好处是易读,容易debug。比如unity用subset of YAML,Cryengine用XML或Json。引擎推荐首先支持此类
    在这里插入图片描述
  2. Binary File:二进制,例如:UAsset(Unreal)、FBX Binary、unity Runtime等。好处是存储容量小,并且容易加密,安全性高。比如FBX Binary比FBX text占用小很多,同时还省去了语义的兼容过滤处理,总体加载速度能快10倍。因此上线产品一般用这种形式。

资产引用

在游戏中,很多东西会重复出现,为了节省内存,我们需要资产引用:只存储引用,通过引用实例化(Instance)重复对象(Prefab),这是资产系统和工具链最核心的底层逻辑。

  1. 对象实例化变体(Prefab与Prefab Variant)
    通过复制的方式构建变体:复制原先数据并修改,但是比较低效并且丧失关联性。
  2. 通过数据继承(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等
  • 可以数据继承
  • 两种定义方式:
  1. file:好定义;但需要代码生成器,可能有版本问题,同时无法定义api
  2. 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,应用二进制接口)是指应用程序与操作系统或其他程序…...

处理 **5万字(约7.5万-10万token,中文1字≈1.5-2token)** 的上下文

处理 5万字(约7.5万-10万token,中文1字≈1.5-2token) 的上下文,对模型的长文本处理能力和显存要求较高。以下是不同规模模型的适用性分析及推荐: 一、模型规模与上下文能力的关系 模型类型参数量最大上下文长度&#…...

【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)

羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_82648291?typebbshttps://blog.csdn.net/2401_8264829…...

springboot 启动原理

目标: SpringBootApplication注解认识了解SpringBoot的启动流程 了解SpringFactoriesLoader对META-INF/spring.factories的反射加载认识AutoConfigurationImportSelector这个ImportSelector starter的认识和使用 目录 SpringBoot 启动原理SpringBootApplication 注…...

浅析DDOS攻击及防御策略

DDoS(分布式拒绝服务)攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求,耗尽其资源,从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性,使攻击规模更大、影响范围更广…...

Linux网络 HTTPS 协议原理

概念 HTTPS 也是一个应用层协议,不过 是在 HTTP 协议的基础上引入了一个加密层。因为 HTTP的内容是明文传输的,明文数据会经过路由器、wifi 热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的…...

Idea插件开发

相关操作 执行插件 导出插件 然后到 /build/distributions 目录下面去找...

Java 有很多常用的库

1. 常用工具类库 Apache Commons:提供了大量常用的工具类,如: commons-lang3:字符串、数字、日期等常用工具类。commons-io:IO 操作,文件读写、流处理等。commons-collections4:集合类扩展。 G…...

pytorch实现文本摘要

人工智能例子汇总:AI常见的算法和例子-CSDN博客 import numpy as npfrom modelscope.hub.snapshot_download import snapshot_download from transformers import BertTokenizer, BertModel import torch# 下载模型到本地目录 model_dir snapshot_download(tians…...

C++基础day1

前言:谢谢阿秀,指路阿秀的学习笔记 一、基础语法 1.构造和析构: 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。 构造顺序:父类->子类 析…...

从TinyZero的数据与源码来理解DeepSeek-R1-Zero的强化学习训练过程

1. 引入 TinyZero(参考1)是伯克利的博士生复现DeepSeek-R1-Zero的代码参仓库,他使用veRL来运行RL强化学习方法,对qwen2.5的0.5B、1.5B、3B等模型进行训练,在一个数字游戏数据集上,达到了较好的推理效果。 …...