Unity官方公布热更新方案性能对比

孙广东  2016.3.11

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

http://china.unity3d.com

时间: 2024-10-12 11:23:12

Unity官方公布热更新方案性能对比的相关文章

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

孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda ?  什么是热更新 ?  为何要热更新 ?  怎样在iOS 上对Unity 应用进行热更新 ?  支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 ? 广义定义 ? 无需关闭server,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码. ? 狭义定义( iOS热更新) ? 无需将代码又一次打包提交至AppStore,就可以更新clien

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

最近研究了一下如何在unity中实现c#的热更新,对于整个DLL热更新的过程和方案有一个初步的了解,这儿就写下来,便于后续的深入调查和方案选择. 一.C# DLL的动态加载和卸载 既然要热更新,那么就是动态的加载c#的DLL,所以第一步就是研究如何实现DLL的动态加载和卸载. 在CLR Via C#中,对于DLL的加载有详细的讲解,这儿就不再长篇幅的讲解整个过程,简单的来说,在C#的工程中,都会生成一个默认的程序域appDomain,就叫做DefaultAppDomain吧,在这个程序域的基础上

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

一.IOS对DLL热更新的禁止 紧接上文,继续对C#热更新的研究.上文中,已经说了如何基于appDomain来实现对DLL的加载和卸载,进一步,可以在unity工程中,将Dll打包成资源,通过Assembly.Load的方式加载DLL来实现更新.那么为什么IOS中就不能这样操作了呢? 推荐阅读文章: Mono为何能跨平台?聊聊CIL(MSIL) - 陈嘉栋 - 博客园 偷了我的热更新?Mono,JIT,iOS 这两篇文章,对整个IOS不能热更新的缘由,有详细的讲解,对于Mono的JIT编译模式和

我使用的 unity 热更新方案 JSB(求小编 推荐一下)

今天周五 ,明天没有什么事情,可以安心写一些博客. 今天聊 两个话题 一 , unity热更新的窘境 二 ,我所使用的unity 热更新方案JSB ======================================热更新的窘境============================================= (1)其实unity 热更新到瓶颈是 ios 的 系统本身 ,禁止你 jit .说白了,内存中代码,系统本身不让你执行. 安卓 系统,桌面 系统,本身都支持 动态直接替换d

Unity3D热更新方案网摘总结

参考:http://blog.csdn.net/guofeng526/article/details/52662994 http://blog.csdn.net/u010019717/article/details/50853207 "热更新"这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技术,我们姑且这么叫它,相信很长时间内,大家依然还会这么叫,甚至有人叫它"暖更新". 一.什么是热更新? 广义定义 无需关闭服务器,不停机状态下修复漏

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

PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5%88%86%E4%BA%ABPPT.pptx 一 .热更新(热修复)产品背景 这里谈到的热更新都是指APP(不包含网页).APP按大类别可以粗略分为 应用 和 游戏.APP的开发周期是极其快速的,在实际开发流程中,我们总会有一些需求迫使我们短时间内快速上线,比如需求流程出错,程序员主观导致的一些bu

unity3d的资源管理和热更新方案

之前开发一直使用cocos2dx,最近开始搭建unity3d的框架,遇到的一个大问题就是热更新.虽然代码采用了slua脚本,unity3d官方也提供了assetbundle这样的解决方案,但是还是有好多的问题需要解决. 1.复杂的资源引用方案.cococ2dx的更新方案很简单--添加附加searchpath,这样只要设置更新文件所在的路径,就能保证优先使用最新资源.但是unity3d并不是这样,因为它没有cocos2dx的FileUtils,没办法控制所有资源的加载.unity3d的资源来源有这

Unity热更新方案(uLua vs sLua)

首先附上这两个项目的地址,这两个项目都是比较完善的lua解决方案,从效率和使用方式上说都不相伯仲,我最终选择了ulua,但是并不是说其具有压倒性优势. uLua:http://ulua.org/index.html sLua:https://github.com/pangweiwei/slua 引入lua,基本上就是为了热更新,不过后面苹果似乎对lua脚本的热更新也限制的很严格,拿脚本做热更新也要偷偷摸摸的去做.所以说我一贯的观点是游戏框架设计的合理些(比如技能.界面中可以用配置的,尽量不要硬编

Unity代码热更新方案 JSBinding + SharpKit 介绍

目前Unity的代码更新方案有很多,主要以lua为主. JSBinding + SharpKit 是一种新的技术,他做了两件事情: JSBinding将C#导出到JS中,让你可以用JS写代码,就好像 lua 一样 SharpKit(sharpkit.net)将C#代码翻译成JS代码. 因此,他可以让你使用C#编译代码,之后一键转换成JS代码并正常运行.如果你的项目已经使用C#开发并希望能够更新代码,欢迎尝试使用. 本文先做简介,后续本博客将做详细介绍. 完全支持序列化功能.即可以在 Inspec