Unity 浅谈热更新

目录

一、什么是热更新

过程

热更新的基本流程

导出热更资源

游戏流程热更

二、热更新的优点

开发端

客户端

使用Lua热更新方案的优缺点

XLua

优点

缺点

基于C#热更新方案的优缺点

ILRuntime

优点

缺点

解决方案

HybridCLR(HuaTuo/wolong)

HybridCLR工作原理

优点

缺点


声明:本内容来自各种资料和个人总结

一、什么是热更新

Unity热更新是一种可以让游戏在不关闭App的情况下直接更新代码或资源的技术与传统的游戏开发方式不同,使用热更新技术可以在游戏运行时修复bug、添加新功能或改进游戏性等,而无需通过重新打包发布更新版本的方式。用户不用去重新下载安装包去更新游戏的逻辑等功能。

过程

Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新。

Unity提供可以热更的方案就是AssetsBundle(后面简称AB)。资源、代码都可以打成AB包,放到服务器上,然后比对版本,进行热更。

Unity3D的热更新会涉及3个目录:游戏资源目录、数据目录、网络资源地址。

热更新的基本流程

接下来讲一下热更的基本流程:热更分成2部分

导出热更资源

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

游戏流程热更

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

更新注意:

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

二、热更新的优点

1、可以迅速修复Bug,避免用户再去重新下载安装包,在游戏或软件内部就更新BUG
2、减少安装包的体积,将资源上传到服务器,在运行时动态下载剩余资源
3、迅速进行游戏更新,可以不用再上架应用商店,直接对游戏或软件进行更新 

开发端

1、开发端更新了游戏或软件内容,比如更新了脚本、替换了资源
2、将需要更新的代码或资源,打包成AssetBundle放到服务器
3、在服务器上,修改记录版本号的文件
4、修改服务器上的对比文件

客户端

1、运行程序,进行版本号的比较,版本号不同则进行下面操作
2、下载服务器上的对比文件,类似于目录,确定下载列表
3、根据下载列表,下载所需的资源
4、解压资源,用最新的对比文件覆盖本地的对比文件

使用Lua热更新方案的优缺点

XLua

  1. xLua是腾讯开发的开源Lua插件,它为Unity,.Net,Mono等C#环境增加Lua脚本编程的能力,借助xLua可以使lua代码与C#相互调用
  2. 游戏中的更新包括资源更新(UI,Audio等)和代码更新,资源可以通过打AB包放在服务器上,Lua代码可以直接放在服务器端,玩家启动游戏时会去服务器端检查更新进行替换(使用MD5校验)

市面上大部分都是ToLua和XLua 都是使用的语言都是lua和lua虚拟机

所以我们统称为lua

优点

Lua语言由C语言编写,通用性强,可以运行在各类操作系统
Lua语言是解释性语言,由虚拟器解释执行,无需进行编译
有很多成熟的项目在使用Lua,有较多的使用文档


缺点

学使用一门Lua语言,增加学习和开发成本(心酸泪)
Lua是弱类型的非面向对象的语言,在大型项目中容易造成结构混乱和维护困难的问题
Lua需要在C#环境中提供运行环境,对Lua和C#进行相互转换和调用,效率低下,不如原生C#进行开发

基于C#热更新方案的优缺点

ILRuntime

是掌趣科技开发的开源unity热更框架, 这个框架打破了C#不能做ios平台热更的规则(在ios平台中是以ILRuntime+dll的方式解释执行,当然是在IL2CPP下)。有了这个框架,开发者只需使用C#这一种语言即可,而不用在C#和lua之间切换,但这个框架也是有很多坑的,在一些方面性能是不如lua的,Git上的贡献者也很少,暂时没有经过大量项目的考验,用的人相对还是比较少


优点

Unity开发均使用C#,开发语言统一,编码更容易。
使用纯C#开发无需另创虚拟机等环境,效率高,性能远高于Lua


缺点

方案均有各自的局限性,直接反射方式不仅损耗性能,在不支持JIT的系统(IOS)上无法使用。
ILRuntime解决了 JIT


解决方案

DLL反射热更新: 使用编译后的DLL文件进行替换,利用反射方式把所需C#组件绑定到相应的对象上使用。
ILRuntime:本质还是DLL的替换,但实现了一个 ILR 使其能够在不支持 JIT

HybridCLR(HuaTuo/wolong)


HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的c#热更新方案。

HybridCLR提供一个非常完整的跨平台 CLR 运行时,不仅能在Android平台,也能在IOS、Consoles等限制了JIT的平台上高效地以 AOT

Unity开发者从此可以完全使用c#开发,并且零成本使用几乎所有的c#特性,再也不需要使用各种脚本或者不完整的热更新方案了。

HybridCLR工作原理


HybridCLR扩充了unity的 il2cpp runtime,将它由纯AOT运行时改造为"AOT

更具体地说,HybridCLR做了一下几点工作:

实现了一个高效的元数据(dll)解析库
改造了 il2cpp
实现了一个IL指令集到自定义的寄存器指令集的compiler
实现了一个高效的寄存器解释器
额外提供大量的instinct函数,提升解释器性能
提供hotfix AOT
与其他热更新方案的区别

优点


特性完整。 近乎完整实现了ECMA-335规范,除了 下文中"限制和注意事项" 之外的特性都支持。
零学习和使用成本。 HybridCLR是完整的 CLR 运行时,热更新代码与 AOT 代码无缝工作。不需要额外写- - 任何特殊代码、没有代码生成,也没有什么特殊限制。脚本类与 AOT
执行高效。实现了一个极其高效的寄存器解释器,所有指标都大幅优于其他热更新方案。性能测试报告
内存高效。 热更新脚本中定义的类跟普通c#类占用一样的内存空间,远优于其他热更新方案。内存占用报告
原生支持修复 AOT

缺点

目前(2023上半年)上线的实战的商业项目较少 本人未知(以后可能会更新  未来可期 )

猜你喜欢

转载自blog.csdn.net/q1295006114/article/details/130573208