zoukankan      html  css  js  c++  java
  • unity热更(一)

    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下的程序热更新;JITiOS下无效。

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

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

    计算机生成了可选文字:脚 本 转 化 为 Lua 脚 本 可 直 接 解 释 执 行 Apple 逻 辑 代 码 代 码 生 成 技 术 ( 如 Protobu0 文 本 资 源 ( 如 同 纹 理 、 音 频 等 ) 更 新 资 源 的 形 式 更 新 程 序 unity

    • 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 热更新的总体流程

    计算机生成了可选文字:游 戏 游 戏 公 司 待 更 新 资 ( 数 据 & 逻 辑 ) Apple 热 更 新 游 戏 App Store 用 户 待 更 新 资 源 ( 数 据 & 逻 辑 ) V

    计算机生成了可选文字:(AssetBundles) AssetBundles Runtime StreamingAssets AssetBundles persistentDataPath

    支持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

  • 相关阅读:
    PreparedStatementUpdateTest.java
    JDBCUtils.java
    StringTest.java
    创建线程的方式四:使用线程池
    用递归实现解决斐波那契数列。
    反射的用处。Class对象的介绍,怎么通过反射创建实例和调用方法。
    基于jenkins+docker+git 持续化自动部署项目(详细版一));
    git常用命令,linus的神作之一。
    电话号码的字母组合。(每天一道,防止痴呆)
    编写一个函数来查找字符串数组中的最长公共前缀。(每天一道防止痴呆)
  • 原文地址:https://www.cnblogs.com/DOGame/p/8683200.html
Copyright © 2011-2022 走看看