孙广东  2016.3.11

Unity应用的iOS热更新

作者:丁治宇

Unity TechnologiesChina

Agenda

•  什么是热更新

•  为何要热更新

•  怎样在iOS 上对Unity 应用进行热更新

•  支持Unity iOS 热更新的各种Lua 插件的对照

什么是热更新

• 广义定义

• 无需关闭server,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码。

• 狭义定义( iOS热更新)

• 无需将代码又一次打包提交至AppStore,就可以更新client的执行代码,即不用下载app而自己主动更新程序。

• 现状

• 苹果禁止了C#的部分反射操作,禁止JIT(即时编译。程序执行时创建并执行新代码),不同意逻辑热更新,仅仅同意使用AssetBundle进行资源热更新。

为何要热更新

• 缩短用户获取新版应用的client的流程。改善用户体验。

• 详细到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 自己看

http://china.unity3d.com

Unity官方发布热更新方案性能对照的更多相关文章

  1. Unity实现c#热更新方案探究(三)

    转载请标明出处:http://www.cnblogs.com/zblade/ 前面两篇文章从头到尾讲解了C#热更新的一些方案,从程序域来加载和卸载DLL,到使用ILRuntime来实现安卓和IOS平台 ...

  2. Unity实现c#热更新方案探究(一)

    转载请标明出处:http://www.cnblogs.com/zblade/ 最近研究了一下如何在unity中实现c#的热更新,对于整个DLL热更新的过程和方案有一个初步的了解,这儿就写下来,便于后续 ...

  3. Unity实现c#热更新方案探究(二)

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.IOS对DLL热更新的禁止 紧接上文,继续对C#热更新的研究.上文中,已经说了如何基于appDomain来实现对DLL ...

  4. unity热更新方案对比

    Unity应用的iOS热更新 •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对Unity 应用进行热更新 •  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...

  5. Unity代码热更新方案 JSBinding + SharpKit 首页

    目前Unity的代码更新方案有很多,主要以lua为主. JSBinding + SharpKit 是一种新的技术,他做了两件事情: JSBinding将C#导出到 JavaScript (引擎是 Mo ...

  6. 【腾讯Bugly干货分享】手游热更新方案xLua开源:Unity3D下Lua编程解决方案

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2bY7A6ihK9IMcA0bOFyB-Q 导语 xL ...

  7. Unity3D 热更新方案(集合各位专家的汇总)

    http://blog.csdn.net/guofeng526/article/details/52662994 热更新”这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技 ...

  8. 腾讯开源手游热更新方案,Unity3D下的Lua编程

    原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...

  9. Unity3D热更新方案网摘总结

    参考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/article/ ...

随机推荐

  1. sqlmap批量扫描burpsuite拦截的日志记录

    1.功能上,sqlmap具备对burpsuite拦截的request日志进行批量扫描的能力 python sqlmap.py -l hermes.log --batch -v 3 --batch:会自 ...

  2. iOS:Xcode7下创建 .a静态库 和 .framework静态库

    Xcode7 中创建静态库:.a 和 .framework 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开 ...

  3. 爬虫扒下 bilibili 视频信息

    B站算是对爬虫非常非常友好的网站啦! 修改转载已取得腾讯云授权 在以上两篇文章中我们已经在腾讯云服务器上搭建好了 Python 爬虫环境了,下一步就是在云服务器上爬上我们的爬虫,抓取我们想要的数据: ...

  4. kafka启动报错:kafka.common.KafkaException: Failed to acquire lock on file .lock

    kafka 异常退出后重启时遇到的问题 解决: 执行 netstat -lnp|grep 9092 在执行结果中找到进程号执行 kill -9 进程号再尝试启动Kafka  

  5. Nginx 报错413 Request Entity Too Large 上传文件过大

    1.进入Nginx安装路径下的conf文件夹中(我的路径是:/usr/local/nginx/conf) 2.打开nginx.conf,在http大括号中第一行加语句:client_max_body_ ...

  6. [TypeScript] Dynamically initialize class properties using TypeScript decorators

    Decorators are a powerful feature of TypeScript that allow for efficient and readable abstractions w ...

  7. crm查询和删除审核历史记录

    using System;     using System.Linq;     using Microsoft.Xrm.Sdk;     using Microsoft.Xrm.Sdk.Query; ...

  8. mac打开所有软件源

    sudo spctl --master-disable

  9. Session机制详细介绍

    Session机制详细介绍  

  10. mybatis 自动更新表结构 ,兼容通用tkmapper

    1.maven引入jar <dependency> <groupId>com.github.gonglb.tools</groupId> <artifactI ...