为什么需要热更新

游戏总是伴随着不断的开发与维护,我们不能要求玩家每次都将游戏客户端卸载重装,所以需要热更新技术来在不需要重装客户端的情况下下载更新游戏里的代码(其实资源也需要热更新,但是因为操作系统没有对资源文件热更新做限制,所以这里按下不提)。

直接覆盖DLL

这里只说android平台,unity打包安装包之后会生成一个apk文件,该文件事实上是一个zip文件,只是后缀名不同,解压可以看到在 assetsbinDataManaged 目录下有 predefined assemblies,也就是脚本编译成的DLL(默认名为Assembly-CSharp,在VS的 Solution Explorer 里可以看到),这就是游戏运行时代码所在,如果可以将新代码的dll直接覆盖替换,即可实现热更的目的,自定义 assemblies 的情况也差不多,覆盖需要的dll就完事了(要注意版本,宏之类的坑)。上面说的是mono的情况,IL2CPP的话,则是另外的目录(libarmeabi-v7a)这里有个小坑,so文件中存放的只是代码段,数据段(比如字符串)是在assetsbinDataManagedMetadataglobal-metadata.dat 中。我测试的时候只改了覆盖了so文件,结果修改没有生效让我困惑了老半天 。unity 用于快速迭代的pacth功能,也是类似的原理。不过因为ios平台上不支持JIT而且还禁止dll热更,所以不支持这种方法,所以如果只开发安卓平台的话,就可以用这种方法,简单直观。不过现实是稍微正经的项目都是要支持ios的,毕竟市场占有率摆在那。。所以接下来回到现实。

基于Lua的热更

单纯使用Lua开发

Lua 是一种脚本语言,可以运行再对应平台的虚拟机上。Lua 在虚拟机上是被 解释-执行,而不是像 JIT 一样先编译成对应机器码,所以不会受到IOS的限制。我们所需要做的就是在程序里嵌入一个Lua解释器然后在运行时读取脚本并解释执行(当然,还要再C#与Lua代码之间做一些数据通信,以及在Lua代码支持对C#的调用 )。比如像下面这样的代码

void 

通过覆盖脚本即可实现逻辑的更新。lua方案相比起C#通过 JIT 或者 AOT 得到的 native code 一般而言性能上相对弱势,更不用说还有 IL2CPP这种东西。把性能敏感模块弄成非 lua 代码还是相当地有必要的。所以还是需要提前确定好哪部分代码是需要热更的,需要项目把频繁迭代的业务模块以及稳定的基本功能模块划分开来,(不过大部分项目早期开发基本所有地方都是要频繁地迭代修复的。。。)。

C#转Lua

Lua 这种弱类型语言开发效率与维护体验对很多人来说都是不如C#的,于是就出现了一些能够将C#代码转换为Lua的工具。比如这个。但是显然lua不可能把所有特性都支持了,实际项目也不是所有代码都需要热更新,实际搞进工作流还是有很多的麻烦的,不过幸好已经有了很多比较成熟的方案,比如 xlua 。总的来说这类方案的核心热更原理还是基于Lua解释型脚本语言的特点。

ILRuntime

Unity 是通过Mono来将 C# 编译为 CIL,然后通过将 CIL 运行不同平台的CLR上来实现跨平台。前面提到了IOS禁止动态加载dll与JIT。但是并没有禁止脚本解释。ILRuntime即是实现了一个IL的运行时,或者说解释器,把dll中的 IL 指令像脚本一样解释执行,而不是通过JIT或者AOT编译为机器码。这实在是一个思路清奇的东西,整出了C#编译成IL运行一个能解释IL的解释器并用他来解释执行别的IL这样给人套娃感觉的东西,作者是真的强。

因为IOS还是禁止dll更新,所以要把编译完包含 IL 的 dll(还有pdb,如果希望有调试信息的话) 打包成另外的文件加载,然后在运行时动态加载、解析、解释、执行。

ILRuntime的好处是,开发语言可以继续使用C#(或者别的能编译成IL的语言)进行开发。同时还能实现热更。开发效率比纯 Lua 的高,支持的C#特性比C#转Lua的方案要多。缺点是性能较差(仅限不支持JIT的平台,有JIT的话ILRuntime会跑得更快,性能能被拉平),主要是体现在一些计算密集的地方,相比起Lua会有劣势。

然后使用时还需要注意跨域继承(注意不要继承 Mono Behavior,坑太多。。),如果脚本代码也需要热更的话,就对几个事件函数做一下重定向(当然,这里得用ILRuntime调用热更代码的接口,我见过居然用反射来重定向到热更代码的人。。)、传递闭包时需要写适配,还有用 CLR绑定和值绑定优化性能热点,不过官方提供了一些自动生成代码的工具,结合项目情况改改还是问题不大的,至少不会比写Lua恶心。 如果使用IL2Cpp的话,还要注意对泛型方法做CLR绑定以及类型裁剪的坑。更多细节可以看官方文档。

代码文件的热更

上文中没有提及到的一个很重要的点就是没有提及代码文件(Lua脚本,或者DLL)如何下载覆盖更新,事实上这个问题与代码热更新关系不大,可以把这些代码文件当成普通的资源从服务器上下载、更新、加载,当然这个过程还涉及到一些版本比较之类的东西,本文就不详细展开了。

参考链接

flashyiyi:一些新潮的Unity热更方案​zhuanlan.zhihu.com

https://ourpalm.github.io/ILRuntime/public/v1/guide/index.html​ourpalm.github.io

iOS代码质量要求_Unity移动端代码热更新技术学习总结相关推荐

  1. Unity热更新技术学习——AssetsBundle详解

    文章目录 热更新 AssetsBundle Resources AssetsBundle 存储目录 目录实例 构建AssetsBundle 清单文件 AB包 AssetBundle依赖 AssetBu ...

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

    出自:http://www.cnblogs.com/Creator/p/7007694.html 为什么要做热更新 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙 ...

  3. iOS 热更新技术探索

    1.什么是热更新. 受限于iOS平台需要先审核在上线,一旦线上发现bug,想要修复还需要等到下次版本提交,这无形中会带给我们一些困扰,尤其是一些BAT量APP,所以热更新技术应运而生. 2.热更新解决 ...

  4. 苹果为什么要禁止 JSPatch 等热更新技术?

    声明:本文为作者投稿,CSDN 基于原文进行了完善,版权为原作者所有,未经作者允许,请勿转载. [CSDN有奖征稿啦]技术之路,共同进步,有优质移动开发.VR/AR/MR.物联网原创技术文章欢迎发送邮 ...

  5. 一文解释到底什么是“APP热更新技术”?

    首先,热更新技术作为一种App软件开发者常用的更新方式,简而言之就是用户在下载安装APP之后,会有APP的即时更新. 自从2017年苹果App Store针对热更新的下架事件发生之后,诸多开发者也在不 ...

  6. Unity热更新技术整理

    一.热更新学习介绍 1.什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新 ...

  7. Unity3D热更新技术点——ToLua(上)

    注: 本文主要介绍tolua的基本原理及其在unity中的使用,希望阅读本文的读者有lua基础,可通过Lua教程 (其中也有IDE的推荐等)或其他途径先进行lua 的学习 热更新 在介绍tolua前, ...

  8. Android热更新技术的研究与实现Sophix

    所以阿里爸爸一直在进步着呢,知道技术存在问题就要去解决问题,这不,从Dexposed-->AndFix-->HotFix-->Sophix,技术是越来越成熟了. Android热更新 ...

  9. Unity HybridCLR热更新技术实现

    最近我们在项目中遇到了一个问题:经常需要修改游戏逻辑,如果每次修改都需要重新打包发布,那将会非常耗时,于是我们开始寻找解决方案.最后我们找到了 Unity HybridCLR 热更新技术,实现了游戏逻 ...

最新文章

  1. Python地信专题 | 基于geopandas的空间数据分析-文件IO篇
  2. 【收藏】mydockfinder下载地址
  3. 【tensorflow】Sequential 模型方法
  4. .net core DI 注册 Lazy 类型
  5. Fedora 17 下 Samba 服务快速设置
  6. Debian 7.8 通过 apt-get 安装 nodejs
  7. 富士通大数据架构解决方案闪耀存储峰会
  8. Java基础:什么是返回对象
  9. PHP之内置web服务器
  10. FreeMarker(一)初识
  11. SQL Server中的日期类型
  12. 极域电子教室64位破解版|极域电子教室软件64位破解版下载v6.0
  13. SIM-MICRO-SIM- NANO SIM 区别
  14. 手机版浏览器f12_没有广告的浏览器??
  15. idea上传写好的springboot项目到码市coding
  16. python plc fx5u_三菱PLC FX5U系列模块型号对照一览表
  17. 安装Python3.6.3+spyder
  18. c# web版本,进销存和财务管理业务系统 ERP系统源码
  19. 【Windows网络重置】
  20. 谷歌大脑与DeepMind合二为一!为对抗OpenAI打造全新大模型

热门文章

  1. Ant 风格路径表达式
  2. 解决wordpress无法离线发布(远程发布)的故障
  3. Prototype1.5.1源代码解读分析-3
  4. 485串口测试工具软件下载_串口调试助手详细讲解(结合实操),通讯问题不再是问题...
  5. nginx 代理多个服务器——多个server方式
  6. linux服务器虚拟内存设置,修改Linux服务器虚拟内存Swap大小
  7. debug error怎么解决_我要以血和泪的经历告诉你,这个 bug 太难解决了
  8. do与mysql数据类型对照_dophon-db: dophon框架的数据库模块,支持mysql,sqlite数据库,带有orm持久化功能与链式操作实例,贴近逻辑习惯,支持mysql多数据源配置...
  9. [转载] python循环中break、continue 、exit() 、pass的区别
  10. Linux中对进程的管理