Unity应用的iOS热更新
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 热更新的 原理
• 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 自己看
Unity应用的iOS热更新的更多相关文章
- iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET
iOS 热更新方案 - lance的专栏 - 博客频道 - CSDN.NET Weex
- iOS热更新实现方式
heart.jpg 苹果静止热更新,可惜我的是企业app,没有这些约束了,随便用.(当然有些热更新已经可以通过苹果审核了,比如JSPatch)官网说的: JSPatch 平台 SDK 1.7.2 以上 ...
- 有关iOS热更新
iOS热更新的几篇文章,看完这几篇,自己集成一下.下面说一下我集成时遇到的问题. 这是原作者的JSPatch的讲解的文章:<JSPatch – 动态更新iOS APP>.<JSPat ...
- iOS热更新-8种实现方式
一.JSPatch 热更新时,从服务器拉去js脚本.理论上可以修改和新建所有的模块,但是不建议这样做. 建议 用来做紧急的小需求和 修复严重的线上bug. 二.lua脚本 比如: wax.热更新时,从 ...
- IOS热更新-JSPatch实现原理+Patch现场恢复
关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...
- Unity 安卓下DLL热更新一(核心思想)
大家都知道一谈起热更新的话首选是Ulua这个插件, 其实Unity可以使用dll热更新的,如果你实在不想用Lua来编写逻辑,0.0请下看Dll+AssetBundle如何实现热更新的.让你看完这个文章 ...
- iOS热更新技术被苹果官方警告?涉及到RN、Weex、JSPatch!!!
今天一早,不少iOS开发群都炸窝了,原因是部分iOS开发者收到了苹果的警告邮件: 有开发者质疑可能是项目中使用了JSPatch.weex以及ReactNative等热更新技术.对于修复bug提交审核的 ...
- iOS热更新技术被苹果官方警告?涉及到RN、Weex、JSPatch
本文为转载文章 故事背景: 这两天,不少iOS开发群都炸窝了,原因是部分iOS开发者收到了苹果的警告邮件: 有开发者质疑可能是项目中使用了JSPatch.weex以及ReactNative等热更新技术 ...
- 关于iOS 热更新(热修复)你必须知道的一种方法- JSPatch
本文为转载文章 . 版权归原文所有. 原文链接:iOS 5分钟集成热修复(JSPatch) 前言 在iOS中有很多种热修复方案,在这里我就不一一介绍了 这里有一篇介绍热修复的文章:iOS中的HotFi ...
随机推荐
- js中innerText/value/innerHTML三个属性的区别
在做一个两个窗口之间的简单信息交互时遇见了一点问题,导致信息无法正常的传递. 最后发现问题是在innerText和value这两个属性上,先简单的总结记录一下几个相似的属性的作用: 1.innerTe ...
- java:Eclipse:Could not create the view:解决办法
Eclipse:Could not create the view: Plug-in org.eclipse.jdt.ui was unable to load class org.eclipse.j ...
- JS多项选择删除
$(document).ready(function(){ $("#batdel").click(function(){ var checkedLen = 0; var check ...
- 时间复杂度O(n)与空间复杂度O(1)
把输入规模看成x轴,所花时间/空间看成y轴.O(n)就是 y = x, y随x的增长而线性增长.一条斜线O(1)就是 y = 1,不管x如何变,y不变.一条与x平行的线 举个简单的例子,要从0加到n, ...
- 【HDU 6428】Calculate 莫比乌斯反演+线性筛
题解 代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod = 1LL&l ...
- 04 - Django应用第一步
知识点 1) 创建项目命令 以及项目结构介绍 2) 创建应用程序命令 应用, 项目的区别 以及应用程序结构 3) 启动项目命令 4) URLs的编写 include()的使用 get发送参数的格式 u ...
- SQL Server DBA十大必备工具使生活轻松
[IT168 技术]曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过 其他工具了;诚然,SSMS和Profil ...
- LeetCode 510. Inorder Successor in BST II
原题链接在这里:https://leetcode.com/problems/inorder-successor-in-bst-ii/ 题目: Given a binary search tree an ...
- bzoj 4822~4824 CQOI2017题解
老C的任务 题目大意: 维护一个二维平面,初始给出一些点及其权.多次询问某个矩形内的权和. n,m <= 100000 题解: 签到题. CDQ水一水. #include <cstdio& ...
- 一个内存增长问题的分析和处理(二)——valgrind工具的用法
valgrind是linux下对C++和C程序进行内存泄露检测的工具,除了内存检测,valgrind还提供了很多其他的功能,这里主要介绍下valgrind的内存检测的功能. 首先是文件的下载,valg ...