Unity应用的iOS热更新

作者:丁治宇

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 热更新的 原理

计算机生成了可选文字:<br />
脚 本<br />
转 化 为<br />
Lua 脚 本 可<br />
直 接 解 释 执<br />
行<br />
Apple<br />
逻 辑 代 码<br />
代 码 生 成 技 术<br />
( 如 Protobu0<br />
文 本 资 源 ( 如 同 纹 理 、 音 频 等 )<br />
更 新 资 源 的 形<br />
式 更 新 程 序<br />
unity

• 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 热更新的总体流程

计算机生成了可选文字:<br />
游 戏<br />
游 戏 公 司<br />
待 更 新 资 ( 数 据 & 逻 辑 )<br />
Apple<br />
热 更 新<br />
游 戏<br />
App Store<br />
用 户<br />
待 更 新 资 源 ( 数 据 & 逻 辑 )<br />
V

计算机生成了可选文字:<br />
(AssetBundles)<br />
AssetBundles<br />
Runtime<br />
StreamingAssets<br />
AssetBundles<br />
persistentDataPath

支持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 自己看

http://china.unity3d.com

Unity应用的iOS热更新的更多相关文章

  1. iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET

    iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET Weex

  2. iOS热更新实现方式

    heart.jpg 苹果静止热更新,可惜我的是企业app,没有这些约束了,随便用.(当然有些热更新已经可以通过苹果审核了,比如JSPatch)官网说的: JSPatch 平台 SDK 1.7.2 以上 ...

  3. 有关iOS热更新

    iOS热更新的几篇文章,看完这几篇,自己集成一下.下面说一下我集成时遇到的问题. 这是原作者的JSPatch的讲解的文章:<JSPatch – 动态更新iOS APP>.<JSPat ...

  4. iOS热更新-8种实现方式

    一.JSPatch 热更新时,从服务器拉去js脚本.理论上可以修改和新建所有的模块,但是不建议这样做. 建议 用来做紧急的小需求和 修复严重的线上bug. 二.lua脚本 比如: wax.热更新时,从 ...

  5. IOS热更新-JSPatch实现原理+Patch现场恢复

    关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...

  6. Unity 安卓下DLL热更新一(核心思想)

    大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll热更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章 ...

  7. iOS热更新技术被苹果官方警告?涉及到RN、Weex、JSPatch!!!

    今天一早,不少iOS开发群都炸窝了,原因是部分iOS开发者收到了苹果的警告邮件: 有开发者质疑可能是项目中使用了JSPatch.weex以及ReactNative等热更新技术.对于修复bug提交审核的 ...

  8. iOS热更新技术被苹果官方警告?涉及到RN、Weex、JSPatch

    本文为转载文章 故事背景: 这两天,不少iOS开发群都炸窝了,原因是部分iOS开发者收到了苹果的警告邮件: 有开发者质疑可能是项目中使用了JSPatch.weex以及ReactNative等热更新技术 ...

  9. 关于iOS 热更新(热修复)你必须知道的一种方法- JSPatch

    本文为转载文章 . 版权归原文所有. 原文链接:iOS 5分钟集成热修复(JSPatch) 前言 在iOS中有很多种热修复方案,在这里我就不一一介绍了 这里有一篇介绍热修复的文章:iOS中的HotFi ...

随机推荐

  1. php发邮件:swiftmailer, php邮件库——swiftmailer

    php发邮件:swiftmailer, php邮件库——swiftmailer 最近看到一个好的php邮件库,与phpmailer作用一样,但性能比phpmailer好,尤其是在处理附件的能力上,发送 ...

  2. TXLSReadWriteII2版本导出Excel文件:

    //TXLSReadWriteII2版本导出Excel文件: procedure TForm1.N1Click(Sender: TObject); var i: Integer; aSaveDialo ...

  3. 我理解的关于Vue.nextTick()的正确使用

    什么是Vue.nextTick() 官方文档解释如下: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 我理解的官方文档的这句话的侧重点在最后那半 ...

  4. lombok_学习_00_资源帖

    二.参考资料 Java界的神器-使用Lombok来消除你的冗余代码量 Lombok:让JAVA代码更优雅 Lombok开发指南

  5. php 二维数组验证一个值是否存在

    php 判断数字在二维数组里 $arr = array( array('a', 'b'), array('c', 'd') ); in_array('a', $arr); // 此时返回的永远都是 f ...

  6. nodejs stream基础知识

    分类 nodejs 的 stream 有四种: Readable:可读流 Writable: 可写流 Duplex:双工流 Transform:转换流 Readable // _read方法是从底层系 ...

  7. 关于c++中的全局变量(不赋值的全局变量算定义)

    定义有三种: 1.不赋值的定义:int a; 2.赋值的定义:int a=5; 或者 int a;a=5; 3.加extern的定义:extern int a=5;//其实和不加是一样的. 声明只有一 ...

  8. codeforces 632B B. Alice, Bob, Two Teams(暴力)

    B. Alice, Bob, Two Teams time limit per test 1.5 seconds memory limit per test 256 megabytes input s ...

  9. javascript获取窗口位置、绝对位置、事件位置等

    有段时间没更新博客了,工作实在太忙了,加班加班再加班就是我们这个行业的常态吧...还好最近把工作进度完成了,终于有些空余时间了.关于<Javascript高级程序设计>系列,我并没有弃坑, ...

  10. HDOJ1024(最大M子段和)

    Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...