Unity3D热更新方案网摘总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3D热更新方案网摘总结相关的知识,希望对你有一定的参考价值。

http://blog.csdn.net/u010019717/article/details/50853207

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

一、什么是热更新?

  • 广义定义
  • 无需关闭服务器,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码。
  • 狭义定义( ios热更新)
  • 无需将代码重新打包提交至AppStore,即可更新客户端的执行代码,即不用下载app而自动更新程序。
  • 现状
  • 苹果禁止了C#的部分反射操作,禁止JIT(即时编译,程序运行时创建并运行新代码),不允许逻辑热更新,只允许使用AssetBundle进行资源热更新。

二、为什么要热更新?

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

  • 缩短用户获取新版应用的客户端的流程,改善用户体验。
  • 具体到iOS平台的应用上,有以下几个原因

? App Store的审核周期难控制。

  • 手机应用更新频繁。
  • 对于大型应用,更新成本太大。
  • 终极状态
  • 不重新下载、不停机状态下完全变换一个应用的内容。

三、如何热更新?Unity3D的热更新的方法比较

3.1android 应用的热更新

将执行代码预编译为assembly dll

将代码作为TextAsset打包进Assetbundle

运行时,使用Reflection机制实现代码的功能。

更新相应的Assetbundle即可实现热更新。

 

3.2Android iOS 热更新的异同

苹果官方禁止iOS下的程序热更新;JITios下无效。

热更新方案:Unity+Lua插件。

 

3.3 使用Lua 插件进行iOS 热更新的原理

技术分享

 

 

3.4Unity 热更新的注意点

需要更新的代码、资源,都必须打包成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.1uLua(asset store)

? uLua插件原生版本,开山鼻祖

不会产生静态代码

反射机制,效率低下,速度慢,gcalloc频繁

已停止更新维护,不支持Unity5.x,淡出主流

 

4.2uLua & cstoLua

开发平台成熟稳定,Bug修复迅速

开发者众多,资源丰富

静态方法,性能优

? 有成功商业产品案例(啪啪三国、超神战队、酷鱼吧捕鱼、绝地战警、这不是刀塔等) 

都是基于原生版本的改进;未来,两者会合并成一个插件

开源项目地址: 

https://github.com/topameng/CsToLua

4.3sLua

静态方法,性能优

核心代码简洁

资源较少,开发平台不够成熟稳定

无成功商业产品案例成功商业产品案例

基于原生版本的改进

开源项目地址:

https://github.com/pangweiwei/slua

4.4C#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的资源管理和热更新方案

Unity3d热更新之下载

Unity3D热更新Unity3D 零成本高性能的C#的热更新框架:HybridCLR

Unity3D热更新Unity3D 零成本高性能的C#的热更新框架:HybridCLR

Unity3D热更新Unity3D 零成本高性能的C#的热更新框架:HybridCLR

lua热更新方案总结