Unity 热更新技术 | (一) 热更新的基本概念原理及主流热更新方案介绍

news2024/11/16 12:42:16

请添加图片描述

  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------

请添加图片描述

Unity 热更新技术最新系列全面教程

  • Unity 热更新技术 | (一) 热更新的基本概念原理及主流热更新方案介绍
      • 前言
    • 一、什么是热更新
    • 二、热更新必要性 作用
    • 三、热更新原理
      • 3.1 为什么实现热更新一般都是用Lua,而不是C#?
    • 四、热更新流程
    • 五、目前主流热更新方案
      • 5.1 LUA热更(XLua/ToLua)(LUA与C#绑定,方案成熟)
      • 5.2 ILRuntime热更
      • 5.3 puerts(普洱TS)
      • 5.4 HyBridCLR(原huatuo)
    • 总结

在这里插入图片描述


Unity 热更新技术 | (一) 热更新的基本概念原理及主流热更新方案介绍

请添加图片描述


前言

  • 开始学习热更新方面系列知识,就从这一篇开始吧!
  • 本系列教程 会从热更新基本概念出发,详细介绍热更新相关的全套知识点。
  • 如热更新技术基本原理、热更新主流方案、AssetBundle系列教程、Lua语言编程、Lua与Unity交互教程、Xlua框架使用、热更新实战教程等方面。
  • 热更新作为一个开发者必备技能,如果想学习的话,可以从现在开始了哦~
  • 接下来先从热更新的基本概念原理及主流热更新方案介绍 开始学习吧!

一、什么是热更新

  热更新 是一种App软件开发者常用的更新方式。简单来说,就是在用户通过下载安装APP之后,打开App时遇到的即时更新。

游戏热更新 是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁。

(1)游戏上线后,在运营过过程中,如果需要更换UI显示,或者修改游戏的逻辑行为。传统的更新模式下,需要重新打包游戏,让玩家重新下载包体,造成用户体验不佳的情况。
(2)热更新允许在不重新下载游戏客户端的情况下,更新游戏内容。

热更新分为 资源热更新 和 代码热更新 两种,代码热更新实际上也是把代码当成资源的一种热更新,但通常所说的热更新一般是指代码热更新。

  • 资源热更新 主要通过AssetBundle来实现,在Unity编辑器内为游戏中所用到的资源指定AB包的名称和后缀,然后进行打包并上传服务器,待游戏运行时动态加载服务器上的AB资源包。
  • 代码热更新 主要包括Lua热更新、ILRuntime热更新和C#直接反射热更新等。由于ILRuntime热更新还不成熟可能存在一些坑,而C#直接反射热更新又不支持IOS平台,因此目前大多采用更成熟的、没有平台限制的Lua热更新方案。

二、热更新必要性 作用

  一个游戏中有个很最重要的部分就是要想方设法的留住用户,如果每次游戏内容发生变化时(这在网游中经常会发生),都需要用户去重新下载一个安装包(客户端),这无疑是对游戏用户的留存产生了一个极大的威胁。

热更新作用:能够缩短用户取得新版客户端的流程,改善用户体验。

  • 没有热更新情况:
    pc用户:下载客户端->等待下载->安装客户端->等待安装->启动->等待加载->玩
    手机用户:商城下载APP->等待下载->等待安装->启动->等待加载->玩

  • 有了热更新情况:
    pc用户:启动->等待热更新->等待加载->玩
    有独立loader的pc用户:启动loader->等待热更新->启动游戏->等待加载->玩
    手机用户:启动->等待热更新->等待加载->玩

通过对比就可以看出,有没有热更新对于用户体验的影响还是挺大的,主要就是省去用户自行更新客户端的步骤。

尤其手游是快节奏的应用,功能和资源更新频繁,特别是重度手游安装包常常接近1个G,如果不热更新,哪怕改动一行代码也要重新打个包上传到网上让玩家下载。
对于IOS版本的手游包IPA,要上传到苹果商店进行审核,周期漫长,这对于BUG修复类操作是个灾难。

所以说就需要热更新技术的出现来解决这个问题。


三、热更新原理

  游戏中一些UI界面和某些模型等等的显示都是通过去加载相应的素材来实现的,当我们只把对应的素材资源进行替换就可以界面和模型发生变化,这个时候我们可以让客户端通过资源对比后从而进行相关资源的下载就可以实现热更新了。

  比如在一个游戏中的某些资源我们是放在服务器中的,当我们需要更换游戏中的某些资源时(如UI界面,某个英雄数值需要调整)。
我们只需要把这些新的资源与旧的资源进行替换,而不需要重新下载整个安装包就可以完成一个游戏版本的更迭,就相当于实现了一次热更新。

  • C#热更原理:将需要频繁更改的逻辑部分独立出来做成DLL,在主模块调用这些DLL,主模块代码是不修改的,只有作为业务(逻辑)模块的DLL部分需要修改。游戏运行时通过反射机制加载这些DLL就实现了热更新。
  • lua热更原理:逻辑代码转化为脚本,脚本转化为文本资源,以更新资源的形式更新程序。

3.1 为什么实现热更新一般都是用Lua,而不是C#?

  既然游戏需要热更新,那么我们既然使用了 Unity引擎,为什么不能直接使用 C# 脚本去进行游戏热更新,反而大多都是使用Lua语言去实现热更新呢?

  这就不得不提一下C#语言的特性了,热更新本身对于资源热更新是非常容易的,Unity自带的AB包就可以轻松解决,难的是代码热更新,因为Unity中的C#是编译型语言,Unity在打包后,会将C#编译成一种中间代码,再由Mono虚拟机编译成汇编代码供各个平台执行,它打包以后就变成了二进制了,会跟着程序同时启动,就无法进行任何修改了。

所以直接使用C#进行热更新显然是不可行的,但是也不是说一点办法也没有。在安卓上可以通过C#的语言特性-反射机制实现动态代码加载从而实现热更新。

C#的编译流程:写好的代码->编译成.dll扩展程序(UnityEditor完成)->运行于Unity
C#热更具体做法:将需要频繁更改的逻辑部分独立出来做成DLL,在主模块调用这些DLL,主模块代码是不修改的,只有作为业务(逻辑)模块的DLL部分需要修改。游戏运行时通过反射机制加载这些DLL就实现了热更新。

但苹果对反射机制有限制,不能实现这样的热更。为了安全起见,不能给程序太强的能力,因为反射机制实在太过强大,会给系统带来安全隐患。

其中 ILRuntime 就是使用C#进行的热更新(后边主流热更新方案中会讲到,这里先提一下)。

  而 LUA 则是解释型语言,并不需要事先编译成块,而是运行时动态解释执行的。这样LUA就和普通的游戏资源如图片,文本没有区别,因此可以在运行时直接从WEB服务器上下载到持久化目录并被其它LUA文件调用。

Lua热更新解决方案是通过一个Lua热更新插件(如ulua、slua、tolua、xlua等)来提供一个Lua的运行环境以及和C#进行交互。

lua热更原理:逻辑代码转化为脚本,脚本转化为文本资源,以更新资源的形式更新程序。


四、热更新流程

在这里插入图片描述

热更的基本流程可以分成2部分:

  • 第一步:导出热更新所需资源
  • 第二步:游戏运行后的热更新流程

第一步、导出热更新所需资源

  1. 打包热更资源的对应的md5信息(涉及到增量打包)
  2. 上传热更对应的ab包到热更服务器
  3. 上传版本信息到版本服务器

第二步、游戏运行后的热更新流程

  1. 启动游戏
  2. 根据当前版本号,和平台号去版本服务器上检查是否有热更
  3. 从热更服务器上下载md5文件,比对需要热更的具体文件列表
  4. 从热更服务器上下载需要热更的资源,解压到热更资源目录
  5. 游戏运行加载资源,优先到热更目录中加载,再到母包资源目录加载

更新注意:
要有下载失败重试几次机制;
要进行超时检测;
要记录更新日志,例如哪几个资源时整个更新流程失败。


五、目前主流热更新方案

  下面举例了目前市面上比较主流的几种热更新方案,后面会针对这几种热更新方案都做一个比较详细的介绍,看一看各自的优缺点。

  • LUA热更(xLua/toLua等)(LUA与C#绑定,方案成熟)
  • ILRuntime热更
  • puerts
  • HyBridCLR(原huatuo)

5.1 LUA热更(XLua/ToLua)(LUA与C#绑定,方案成熟)

  Lua热更原理:逻辑代码转化为脚本,脚本转化为文本资源,以更新资源的形式更新程序
Lua系解决方案: 内置一个Lua虚拟机,做好UnityEngine与C#框架的Lua导出。典型的框架有xLua, uLua,大体都差不多。

  Lua热更新解决方案是通过一个Lua热更新插件(如ulua、slua、tolua、xlua等)来提供一个Lua的运行环境以及和C#进行交互。xLua是腾讯开源的热更新插件,有大厂背书和专职人员维护,插件的稳定性和可持续性较强。

  由于Lua不需要编译,因此Lua代码可以直接在Lua虚拟机里运行,Python和JavaScript等脚本语言也是同理。而xLua热更新插件就是为Unity、.Net、Mono等C#环境提供一个Lua虚拟机,使这些环境里也可以运行Lua代码,从而为它们增加Lua脚本编程的能力。

借助xLua,这些Lua代码就可以方便的和C#相互调用。这样平时开发时使用C#,等需要热更新时再使用Lua,等下次版本更新时再把之前的Lua代码转换成C#代码,从而保证游戏正常运营。

5.2 ILRuntime热更

  ILRuntime 项目是掌趣科技开源的热更新项目,它为基于C#的平台(例如Unity)提供了一个纯C#、快速、方便和可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码热更新。
ILRuntime项目的原理实际上就是先用VS把需要热更新的C#代码封装成DLL(动态链接库)文件,然后通过Mono.Cecil库读取DLL信息并得到对应的IL中间代码(IL是.NET平台上的C#、F#等高级语言编译后产生的中间代码,IL的具体形式为.NET平台编译后得到的.dll动态链接库文件或.exe可执行文件),最后再用内置的IL解译执行虚拟机来执行DLL文件中的IL代码。

  由于ILRuntime项目是使用C#来完成热更新,因此很多时候会用到反射来实现某些功能。而反射是.NET平台在运行时获取类型(包括类、接口、结构体、委托和枚举等类型)信息的重要机制,即从对象外部获取内部的信息,包括字段、属性、方法、构造函数和特性等。我们可以使用反射动态获取类型的信息,并利用这些信息动态创建对应类型的对象。

ILRuntime中的反射有两种:

  • 一种是在热更新DLL中直接使用C#反射获取到System.Type类对象;
  • 另一种是在Unity主工程中通过appdomain.LoadedTypes来获取继承自System.Type类的IType类对象,因为在Unity主工程中无法直接通过System.Type类来获取热更新DLL中的类。

5.3 puerts(普洱TS)

git地址:https://github.com/Tencent/puerts

puerts 解决方案: 内置一个JavaScript/TypeScript解释器,解释执行TypeScript代码。

  • 强大的生态
    引入Node.js以及JavaScript生态众多的库和工具链,结合专业商业引擎的渲染能力,快速打造游戏。
  • 拥有静态检查的脚本
    相比游戏领域常用的lua脚本,TypeScript的静态类型检查有助于编写更健壮,可维护性更好的程序
  • 高效/高性能
    支持反射Binding,无需额外(生成代码)步骤即可开发。也支持静态Binding,兼顾了高性能的场景。

5.4 HyBridCLR(原huatuo)

官方地址:https://hybridclr.doc.code-philosophy.com/

HybridCLR(代号wolong) 是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案。

  HybridCLR扩充了il2cpp的代码,使它由纯AOT (opens new window) runtime变成‘AOT+Interpreter’ 混合runtime,进而原生支持动态加载assembly,使得基于il2cpp backend打包的游戏不仅能在Android平台,也能在IOS、Consoles等限制了JIT的平台上高效地以AOT+interpreter混合模式执行。从底层彻底支持了热更新。
  HybridCLR开创性地实现了 Differential Hybrid Execution(DHE) 差分混合执行技术。即可以对AOT dll任意增删改,会智能地让变化或者新增的类和函数以interpreter模式运行,但未改动的类和函数以AOT方式运行,让热更新的游戏逻辑的运行性能基本达到原生AOT的水平。

个人觉得HyBridCLR最大的优点就是对Unity开发者们非常友好,在使用前搭建好各种配置之后,热更新方面的操作就不需要我们下功夫了,按照之前的开发正常进行就好,只要更换对应的dll文件就可以自动实现热更新功能,恐怖如斯~

后续会详细介绍下HybridCLR,并按照文档做一些案例用于学习使用HybridCLR进行热更新。


总结

  • 总而言之,热更新技术是随着时代发展所诞生的必然趋势,也是作为一个开发者必备的一项技能。
  • 后面会对热更新的解决方案做一个完整的系列教程,感兴趣的小伙伴可以点击订阅专栏立即查看哦!
  • 本篇文章介绍了热更新方面的相关概念知识,后续完整的热更新方案及教程请看专栏其他文章。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是强缓存、协商缓存?

为了减少资源请求次数,加快资源访问速度,浏览器会对资源文件如图片、css文件、js文件等进行缓存,而浏览器缓存策略又分为强缓存和协商缓存,什么是强缓存?什么是协商缓存?两者之间的区别又是什么?接下来本文就带大家深入了解这方面的知识。 强缓存 所谓强缓存,可以理解…

声音生成评价项目AudioLDM_eval项目配置过程

文章目录 引言正文问题一:模型下载不了问题二 TypeError: pad_center() takes 1 positional argument but 2 were given问题三 AttributeError: module numpy has no attribute complex. 结果 引言 对于生成的声音,如何进行评价,一般是通过计…

Matlab之查询子字符串在字符串中的起始位置函数strfind

一、功能 strfind函数用于在一个字符串中查找指定的子字符串,并返回子字符串在字符串中的起始位置。 二、语法 indices strfind(str, pattern) 其中,str是要进行查找的字符串,pattern是要查找的子字符串。 函数会返回一个由子字符串在字…

网络与信息安全基础知识 (软件设计师笔记)

😀前言 在当今世界,我们见证了科技,特别是网络技术的繁荣发展,这种发展不仅让我们的生活变得更加便捷,但也带来了一系列的安全问题。网络安全不仅关系到每一个上网的个人,更是关乎到国家的安全和社会的稳定…

大数据要怎么样学才可以到企业级实战

大数据在企业级实战中扮演着重要角色,因此掌握大数据技术和应用是非常有价值的。下面将详细介绍学习大数据并达到企业级实战水平的步骤和方法。 一、基础知识准备 1. 数据基础知识:了解数据的概念、类型、结构等基本概念,并熟悉常见的数据处…

Edge 无法登录/同步问题【一招搞定】

目录 前言 一、打开 Edge 浏览器显示未同步,点击同步无效 二、Edge 登录报错 0x801901f4 或 0x80190001 解决方法 2.1 报错 0x801901f4 解决方法 2.1.0 Edge 登陆报错图示 2.1.1 添加 Edge 推荐的 DNS 地址 2.1.2 重新登录 Edge 账号成功 2.2 报错 0x801…

第四章 树和二叉树

第四章 树和二叉树 树的基本概念树的概念树的相关术语 二叉树二叉树基本概念二叉树的性质 二叉树的存储结构二叉树的顺序存储结构二叉树的链式存储结构 二叉树的遍历二叉树遍历的递归实现二叉树的层次遍历二叉树遍历的非递归实现 树和森林树的存储结构树、森林与二叉树的关系树…

【低代码开发】:低代码开发助力应用创新

低代码开发:加速应用开发的未来趋势 引言什么是低代码以及功能特点?什么是低代码开发?低代码平台的特点和功能低代码平台的应用场景和优势低代码的优点低代码的缺点低代码平台项目开发流程选择和实施低代码平台 低代码未来的发展趋势低代码平…

Java基础(变量篇)

变量是Java程序中基本的存储单元,变量名有三个基本要素:数据类型、变量名和值。变量名是一块内存单元的名称,就像门牌号一样,通过变量可以找到它表示的内存单元,并对这块内存单元进行操作。在Java中变量必须声明后使用…

英国/法国/意大利/德国/西班牙,电动交通设备配件等相关政策更新

产品安全 合规政策更新! 首先请看邮件内容 尊敬的卖家: 您好! 我们此次联系您是因为您正在销售需要审批流程的商品。为此,亚马逊正在实施审批流程,以确认我们网站上提供的商品类型须符合指定的认证标准。要在亚马逊…

Cesium小技巧:快速打开API文档

学习Cesium.js的人,肯定经常看官方示例, 网址如下: https://sandcastle.cesium.com/ 有个小技巧,可以快速打开具体类的API文档 在示例中,双击具体类名或方法名,会出现一个提示框 单击或右键菜单-在新标…

Linux系统编程:Linux基础

Linux基本使用 安装 这就不说了网上很多教程,随便一个Linux版本都可以,因为命令都差不多。 检查是否有网络 检查网络有以下几个推测方法,如果没有网络的话就按照这几个可能出现问题的地方对症下药寻找解决办法即可: ctrl al…

蓝桥杯基础---切面条

切面条 一根高筋拉面,中间切一刀,可以得到2根面条。 如果先对折1次,中间切一刀,可以得到3根面条。 如果连续对折2次,中间切一刀,可以得到5根面条。 那么,连续对折10次,中间切一刀…

MySQL数据库安装和介绍

一.数据库的介绍 1.1.MySQL数据库是什么? 一款深受欢迎的开源关系型数据库,Oracle旗下的产品,遵守GPL协议,可以免费使用与修改。 官网:MySQL 特点: 性能卓越、服务稳定 开源、无版权限制、成本低 …

优雅而高效的JavaScript——函数柯里化

🙂博主:小猫娃来啦 🙂文章核心:优雅而高效的JavaScript——函数柯里化 文章目录 前言函数柯里化的概念和原理介绍函数柯里化的优点和应用场景函数柯里化的具体实现方式和实例分析函数柯里化在实际项目中的应用函数柯里化与函数式编…

数据结构:链表(1)

顺序表的优缺点 缺点: 1.插入数据必须移动其他数据,最坏情况下,就是插入到0位置。时间复杂度O(N) 2.删除数据必须移动其他数据,最坏情况下,就是删除0位置。时间复杂度O(N) 3.扩容之后,有可能会浪费空间…

Python并发编程简介

1、Python对并发编程的支持 多线程: threading, 利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成多进程: multiprocessing, 利用多核CPU的能力,真正的并行执行任务异步IO: asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行使用Lo…

C++程序员必修第一课【C++基础课程】00:课程介绍

1 课程目标: 搭建 VC 2019 开发环境全面系统学习 C 语法和开发基础学会用代码思维解决实际工作中的问题拥有一定的程序设计能力,能够开发一个完整软件 2 适用人群: 【零基础,想入行 C 程序员,必修第一课程】学生&am…

公众号留言板小程序哪个好用?一一列举

为什么公众号没有留言功能?2018年2月12日之后直到现在,新注册公众号的运营者会发现一个问题:无论是个人还是企业的公众号,在后台都找不到留言功能了。这对公众号来说绝对是一个极差的体验,少了一个这么重要的功能&…

【java学习】对象的产生(18)

文章目录 1. 初始化赋值2. 匿名对象3. 练习3.1. 习题一3.2. 习题二 4. 总结 1. 初始化赋值 当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量类型都是引用类型,如上节的 Person 和前面讲过的数组。 成员…