http://blog.csdn.net/guofeng526/article/details/52662994

热更新”这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技术,我们姑且这么叫它,相信很长时间内,大家依然还会这么叫,甚至有人叫它“暖更新”。

一、什么是热更新?

热更新,是对hot update或者 hot fix的翻译,计算机术语,表示在不停机的前提下对系统进行更改(摘抄一下):

“hot就是热,机器运行会发烫,hot就是不停机的意思。

热更新,是个很形象的词,机器烫的时候更新,开着更新。

比如Windows不重启的前提下安装补丁

比如Http服务器在不重启的前提下换掉一个文件

那么对于Unity3D来说,何谓热更新?

额……这个真相实在是不想讲出来,因为很多时候,这个词都用错了。

Unity3D是一个客户端工具,用户是否重启客户端,根本是我们不关心的问题。

很多时候我们用着热更新这个词汇,却不需要真的热更新。

只有少部分游戏,游戏资源在玩的过程中边玩边下,不重启的前提下变更了资源。

我们不需要用户不重启客户端就能实现资源代码的更新,我们需要的是用户重启客户端能实现资源代码的更新。

让我们暂时放过这个我们的需求连词汇都用错了这个基本事实,来总结一下何谓Unity3D热更新,Unity3D热更新就是指:用户重启客户端就能实现客户端资源代码更新的需求或者功能。”

二、为什么要热更新?

热更新,能够缩短用户取得新版客户端的流程,改善用户体验。

没有热更新:

pc用户:

下载客户端->等待下载->安装客户端->等待安装->启动->等待加载->玩

手机用户:

商城下载APP->等待下载->等待安装->启动->等待加载->玩

有了热更新:

pc用户:

启动->等待热更新->等待加载->玩

有独立loader的pc用户:

启动loader->等待热更新->启动游戏->等待加载->玩

手机用户:

启动->等待热更新->等待加载->玩

通过对比就可以看出,有没有热更新对于用户体验的影响还是挺大的,主要就是省去用户自行更新客户端的步骤。

三、如何热更新?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、各位专家给出的分析

下图纵坐标为测试用例,横坐标是消耗时间或内存分配( 对数坐标 )。

综合来看 肯定是 uLua & cstoLua会更好一些。

五、实践

熟悉NGUI的小伙伴可以参考这里:

https://github.com/jarjin/SimpleFramework_NGUI

熟悉UGUI的小伙伴可以参考这里:

https://github.com/jarjin/LuaFramework_UGUI

Unity3D 热更新方案(集合各位专家的汇总)的更多相关文章

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

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

  2. Unity3D 热更新方案总结

    如何评价腾讯在Unity下的xLua(开源)热更方案? Unity 游戏用XLua的HotFix实现热更原理揭秘 腾讯开源手游热更新方案,Unity3D下的Lua编程 [Unity]基于IL代码注入的 ...

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

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

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

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

  5. Unity3D热更新全书-重头再来

    之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...

  6. Unity3D热更新全书-PageZero

    由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...

  7. 移动端热更新方案(iOS+Android)

    PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...

  8. Unity官方发布热更新方案性能对照

    孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对 ...

  9. Unity3D热更新之LuaFramework篇[10]--总结篇

    背景 19年年初的时候,进到一家新单位,公司正准备将现有的游戏做成支持热更的版本.于是寻找热更方案的任务就落在了我头上. 经过搜索了解,能做Unity热更的方案是有好几种,但是要么不够成熟,要么不支持 ...

随机推荐

  1. Ubuntu配置OpenStack 一:主机环境配置以及问题总结

    本文包含openstack配置的实验环境的基本步骤.在下面的步骤中将逐步讲解如何操作. 1.准备三台虚拟机 主机名字分别命名为controller.network.computer[desktop版或 ...

  2. python3中判断字串类型

    s为字串 s.isalnum() #所有字符都是数字或者字母,为真返回 Ture,否则返回 False. s.isalpha() #所有字符都是字母,为真返回 Ture,否则返回 False. s.i ...

  3. Python读取SQLite文件数据

    近日在做项目时,意外听说有一种SQLite的数据库,相比自己之前使用的SQL Service甚是轻便,在对数据完整性.并发性要求不高的场景下可以尝试! 1.SQLite简介: SQLite是一个进程内 ...

  4. CentOS 6.5 + Nginx 1.8.0 + PHP 5.6(with PHP-FPM) 负载均衡源码安装

    CentOS 6.5 + Nginx 1.8.0 + PHP 5.6(with PHP-FPM) 负载均衡源码安装 http://www.cnblogs.com/ppoo24/p/4918288.ht ...

  5. python-opencv aplpha混合

    import cv2 import os import numpy as np print os.listdir(os.getcwd()) img = cv2.imread('building.jpg ...

  6. IO(Input&Output)流の介绍

    1.导读 对于设备之间的流动(即写入数据或读出数据),Java专门用Java.io包进行操作.这些数据的流动便是我们所说的数据的输入输出流(IO流). 2.数据流的处理:字节流和字符流 数据的基本单位 ...

  7. Linux上安装二进制文件MySQL详解

    前言:昨天晚上搞了很久,终于搞清楚mysql的安装配置了,我真是太low了.当我在云服务器上登进Mysql时,真是高兴哈哈,咱一步一步来,彻底搞懂Mysql的安装配置. 我的安装环境: 阿里云服务器 ...

  8. 如何在 Apple TV 上使用描述文件

    您可以使用 OS X 上的 Apple Configurator 在 Apple TV 上安装配置描述文件. 开始前,请在 Mac 上安装最新版本的 Apple Configurator(如果尚未安装 ...

  9. [Scikit-learn] 4.4 Dimensionality reduction - PCA

    2.5. Decomposing signals in components (matrix factorization problems) 2.5.1. Principal component an ...

  10. Python Web框架篇:Django cookie和session

    part 1 概念 在Django里面,cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话. 两者最大的区别是cookie的信息是存放在浏览器客户端的,而sessio ...