unity热更新il原理
热更新 是一种App软件开发者常用的更新方式。简单来说,就是在用户通过下载安装之后,打开App时遇到的即时更新。
游戏热更新 是指在不需要重新编译打包游戏的情况下,在线更新游戏中的一些非核心代码和资源,比如活动运营和打补丁。unity 教程
(1)游戏上线后,在运营过过程中,如果需要更换UI显示,或者修改游戏的逻辑行为。传统的更新模式下,需要重新打包游戏,让玩家重新下载包体,造成用户体验不佳的情况。 (2)热更新允许在不重新下载游戏客户端的情况下,更新游戏内容。
热更新分为 资源热更新 和 代码热更新 两种,代码热更新实际上也是把代码当成资源的一种热更新,但通常所说的热更新一般是指代码热更新。
∙资源热更新 主要通过AssetBundle来实现,在Unity编辑器内为游戏中所用到的资源指定AB包的名称和后缀,然后进行打包并上传服务器,待游戏运行时动态加载服务器上的AB资源包。
∙代码热更新 主要包括Lua热更新、ILRuntime热更新和C#直接反射热更新等。由于ILRuntime热更新还不成熟可能存在一些坑,而C#直接反射热更新又不支持IOS平台,因此目前大多采用更成熟的、没有平台限制的Lua热更新方案。
二、热更新必要性 作用
一个游戏中有个很最重要的部分就是要想方设法的留住用户,如果每次游戏内容发生变化时(这在网游中经常会发生),都需要用户去重新下载一个安装包(客户端),这无疑是对游戏用户的留存产生了一个极大的威胁。
热更新作用:能够缩短用户取得新版客户端的流程,改善用户体验。
∙没有热更新情况: pc用户:下载客户端->等待下载->安装客户端->等待安装->启动->等待加载->玩 手机用户:商城下载->等待下载->等待安装->启动->等待加载->玩
∙有了热更新情况: 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 则是解释型语言,并不需要事先编译成块,而是运行时动态解释执行的。这样LU
A就和普通的游戏资源如图片,文本没有区别,因此可以在运行时直接从WEB服务器上下载到持久化目录并被其它LUA文件调用。
Lua热更新解决方案是通过一个Lua热更新插件(如ulua、slua、tolua、xlua等)来提供一个Lua的运行环境以及和C#进行交互。
lua热更原理:逻辑代码转化为脚本,脚本转化为文本资源,以更新资源的形式更新程序。
四、热更新流程
热更的基本流程可以分成2部分:
∙第一步:导出热更新所需资源
∙第二步:游戏运行后的热更新流程
第一步、导出热更新所需资源
1.打包热更资源的对应的md5信息(涉及到增量打包)
2.上传热更对应的ab包到热更服务器
3.上传版本信息到版本服务器
第二步、游戏运行后的热更新流程
1.启动游戏
2.根据当前版本号,和平台号去版本服务器上检查是否有热更
3.从热更服务器上下载md5文件,比对需要热更的具体文件列表
4.从热更服务器上下载需要热更的资源,解压到热更资源目录
5.游戏运行加载资源,优先到热更目录中加载,再到母包资源目录加载
更新注意: 要有下载失败重试几次机制; 要进行超时检测; 要记录更新日志,例如哪几个资源时整个更新流程失败。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论