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