Unity3D热更新方案总结
一、什么是热更新?
- 广义定义:无需关闭服务器,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码。
- 狭义定义( iOS热更新):无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即不用下载app而自动更新程序。
- 现状:苹果禁止了C#的部分反射操作,禁止JIT(即时编译,程序运行时创建并运行新代码),不允许逻辑热更新,只允许使用AssetBundle进行资源热更新。
二、为什么要热更新?
热更新,能够缩短用户取得新版客户端的流程,改善用户体验。
- 缩短用户获取新版应用的客户端的流程,改善用户体验。
- 具体到iOS平台的应用上,有以下几个原因:
- App Store的审核周期难控制。
- 终极状态不重新下载、不停机状态下完全变换一个应用的内容。
三、如何热更新?Unity3D的热更新的方法比较
3.1、Android 应用的热更新
• 将执行代码预编译为assembly dll。
• 将代码作为TextAsset打包进Assetbundle。
• 运行时,使用Reflection机制实现代码的功能。
• 更新相应的Assetbundle即可实现热更新。
3.2、Android 与iOS 热更新的异同
• 苹果官方禁止iOS下的程序热更新;JIT在ios下无效。
• 热更新方案:Unity+Lua插件。
3.3、 使用Lua 插件进行iOS 热更新的原理
3.4、Unity 热更新的注意点
• 需要更新的代码、资源,都必须打包成AssetBundle(建议使用未压缩的格式打包)
• 熟悉Unity的几个重要的路径
• Resources(只读)
• StreamingAssets(只读)
• Application.dataPath(只读)
• Application.persistentDataPath(可读写)
3.5、重要路径之 之Resources
• Resources文件夹下的资源无论使用与否都会被打包
• 资源会被压缩,转化成二进制
• 打包后文件夹下的资源只读
• 无法动态更改,无法做热更新
• 使用Resources.Load加载
3.6、重要路径之StreamingAssets
• 流数据的缓存目录
• 文件夹下的资源无论使用与否都会被打包
• 资源不会被压缩和加密
• 打包后文件夹下的资源只读,主要存放二进制文件
• 无法做热更新
• WWW类加载(一般用CreateFromFile ,若资源是AssetBundle,依据其打包方式看是否是压缩的来决定)
• 相对路径,具体路径依赖于实际平台
•Application.streamingAssetsPath
• IOS: Application.dataPath + “/Raw” 或Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
3.7、重要路径之Application.dataPath
• 游戏的数据文件夹的路径(例如在Editor中的Assets)
• 很少用到
• 无法做热更新
• IOS路径: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
3.8、重要路径之Application.persistentDataPath
• 持久化数据存储目录的路径( 沙盒目录,打包之前不存在 )
• 文件夹下的资源无论使用与否都会被打包
• 运行时有效,可读写
• 无内容限制,从StreamingAsset中读取二进制文件或从AssetBundle读取文件来写入PersistentDataPath中
• 适合热更新
• IOS路径: Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
3.9、使用Lua 插件进行iOS 热更新的总体流程
四、支持Unity iOS 热更新的各种Lua 插件的对比
4.1、uLua(asset store)
• uLua插件原生版本,开山鼻祖
• 不会产生静态代码
• 反射机制,效率低下,速度慢,gcalloc频繁
• 已停止更新维护,不支持Unity5.x,淡出主流
4.2、uLua & cstoLua
• 开发平台成熟稳定,Bug修复迅速
• 开发者众多,资源丰富
• 静态方法,性能优
• 有成功商业产品案例(啪啪三国、超神战队、酷鱼吧捕鱼、绝地战警、这不是刀塔等)
• 都是基于原生版本的改进;未来,两者会合并成一个插件
开源项目地址: https://github.com/topameng/CsToLua
4.3、sLua
• 静态方法,性能优
• 核心代码简洁
• 资源较少,开发平台不够成熟稳定
• 无成功商业产品案例成功商业产品案例
• 基于原生版本的改进
开源项目地址:https://github.com/pangweiwei/slua
4.4、C#Light(L#)
淡出主流,想要了解的小伙伴点击这里:https://github.com/lightszero/LSharp
4.5、 uniLua
• c#实现的Lua虚拟机,非完整方案
• 淡出主流
4.6、XLua
腾讯开源xlua
https://github.com/Tencent/xLua
4.7、各位专家给出的分析
下图纵坐标为测试用例,横坐标是消耗时间或内存分配( 对数坐标 )。