Unity3D热更新方案网摘总结
“热更新”这个词,在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、各位专家给出的分析
下图纵坐标为测试用例,横坐标是消耗时间或内存分配( 对数坐标 )。



综合来看 肯定是 uLua & cstoLua会更好一些。
五、实践
熟悉NGUI的小伙伴可以参考这里:
https://github.com/jarjin/SimpleFramework_NGUI
熟悉UGUI的小伙伴可以参考这里:
https://github.com/jarjin/LuaFramework_UGUI
Unity3D热更新方案网摘总结的更多相关文章
- Unity3D 热更新方案(集合各位专家的汇总)
http://blog.csdn.net/guofeng526/article/details/52662994 热更新”这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技 ...
- Unity3D 热更新方案总结
如何评价腾讯在Unity下的xLua(开源)热更方案? Unity 游戏用XLua的HotFix实现热更原理揭秘 腾讯开源手游热更新方案,Unity3D下的Lua编程 [Unity]基于IL代码注入的 ...
- 【腾讯Bugly干货分享】手游热更新方案xLua开源:Unity3D下Lua编程解决方案
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/2bY7A6ihK9IMcA0bOFyB-Q 导语 xL ...
- 腾讯开源手游热更新方案,Unity3D下的Lua编程
原文:http://www.sohu.com/a/123334175_355140 作者|车雄生 编辑|木环 腾讯最近在开源方面的动作不断:先是微信跨平台基础组件Mars宣布开源,腾讯手游又于近期开源 ...
- 移动端热更新方案(iOS+Android)
PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...
- Unity3D热更新全书-重头再来
之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...
- Unity3D热更新全书-PageZero
由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...
- Unity代码热更新方案 JSBinding + SharpKit 首页
目前Unity的代码更新方案有很多,主要以lua为主. JSBinding + SharpKit 是一种新的技术,他做了两件事情: JSBinding将C#导出到 JavaScript (引擎是 Mo ...
- Unity3D热更新之LuaFramework篇[02]--用Lua创建自己的面板
在上篇文章 Unity3D热更新之LuaFramework篇[01]--从零开始 中,我们了解了怎么获得一个可用的LuaFramework框架. 本篇将我会先介绍一下如何配置Lua开发环境,然后分析在 ...
随机推荐
- Poj 3268 Silver cow party 迪杰斯特拉+反向矩阵
Silver cow party 迪杰斯特拉+反向 题意 有n个农场,编号1到n,每个农场都有一头牛.他们想要举行一个party,其他牛到要一个定好的农场中去.每个农场之间有路相连,但是这个路是单向的 ...
- 你浏览器的书签栏还够用么? - 程序员学点xx 特辑
lluxury 运维开发时间 为什么会想到这个话题,是因为最近看到的一条广告:注册 xx 送2048GB资料.yann 暗自感慨:"都9012年了,还有人分享家里的祖传硬盘".2T ...
- MVC一个action对应多个视图的写法
一,如下代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
- SAAS多租户数据逻辑隔离
基于Mybatis 的SAAS应用多租户数据逻辑隔离 package com.opencloud.common.interceptor;import org.apache.commons.lang3. ...
- Oracle package demo 包
1.package 程序包说明(由函数.过程.变量.常量.游标和异常组成) create or replace package pk_test is -- Author : CHEN -- Creat ...
- BZOJ1135 LYZ(POI2009) Hall定理+线段树
做这个题之前首先要了解判定二分图有没有完备匹配的Hall定理: 那么根据Hell定理,如果任何一个X子集都能连大于等于|S|的Y子集就可以获得完备匹配,那么就是: 题目变成只要不满足上面这个条件就能得 ...
- window.onload()和$(document).ready的区别( $(document).ready == $(function(){ }) )
首先$(function(){}) 和 $(document).ready(function(){}) 是一个方法,$(function(){})为简写(用的多) $(document).ready和 ...
- Jenkins 使用python进行调度,并下载apphost上的安装包
在持续集成的过程中,Jenkins工具是我们必须要会用的工具,那么今天分享一个使用python对Jenkins进行调度的案例 使用的是python-jenkins 库,借用selenium登陆jenk ...
- ssh服务配置
------------------------------------------ ssh 服务安装ssh apt-get install openssh-server启动 service ssh ...
- [CF959D]Mahmoud and Ehab and another array construction task题解
解法 非常暴力的模拟. 一开始吧\(1 -> 2 \times 10^6\)全部扔进一个set里,如果之前取得数都是与原数组相同的,那么lower_bound一下找到set中大于等于它的数,否则 ...