关于热更的杂记

JIT与AOT

ILRUNTIME可以根据平台设置,如果是安卓就用JIT,如果是IOS就用解释器来解释执行

关于IOS为什么不能通过DLL热更
原因:UNITY在IOS上是AOT编译的,即在程序运行前已经将IL代码编译成了本地机器码,
https://blog.csdn.net/yy405145590/article/details/41282669?locationNum=14

【编译MONO源码实现代码热更】
MONO源码中有一个接口mono_image_open_from_data_with_name,功能是用来加载Assembly-CSharp.dll,
这个接口在安卓与IOS都一样,在安卓上可以通过修改它来实现热更,在IOS却不行,猜测原因:
1,安卓支持JIT,mono_image_open_from_data_with_name返回的IL代码可以在程序运行时边解释边执行
2,IOS,U3D在IOS平台执行的是FULL AOT,即在IPA安装时调用mono_image_open_from_data_with_name来加载Assembly-CSharp.dll并进行编译,生成本地机器码并存储到手机上,以后每次运行执行的都是安装时生成的机器码,所以实现不了热更

参考资料:https://blog.csdn.net/yy405145590/article/details/41282669?locationNum=14


这个接口

参考:
1,https://www.iteye.com/blog/wanzhanzhuce-2265055
2,我们知道C#脚本首先会被编译成IL代码,然后再由CLR从内存中读取这些IL代码并将其转化为原生代码,这是.NET程序的运行机制,而Mono是.NET在开源社区中的一种实现,Mono对C#代码的编译分为两种,即即时编译JIT(动态)和提前编译AOT(静态),这是Mono能为我们提供的两种编译方式。而从客观上来讲,iOS禁止通过JIT这种方式来编译,所以你无法绕过AppStore直接对程序进行更新,因为即使你更新了C#脚本,由于这些脚本是没有经过编译的,它是无法直接运用到实际环境里的,而使用Lua进行热更新,实际上改变的是应用层的逻辑,核心逻辑依然是在游戏发布时就和应用程序一起打包了,因为Lua无需编译,所以它可以像普通文本资源一样更新,和C#一样Lua无法在运行时期间产生新的代码,它永远都是调用已存在的代码。所以综上所述,Unity引擎在iOS上无法热更新的关键是在iOS系统禁止了即时编译JIT这种权限,这个锅Unity和Mono都不背,谢谢!

Mono在Full AOT模式下的限制
https://www.cnblogs.com/tekkaman/p/3973452.html?utm_source=tuicool&utm_medium=referral

AOT是在安装时执行编译的,比如基于UNITY的APK安装时,会将IL代码编译为本机的本地代码,保存在手机的存储中,
因此AOT会使增加安装时间。
好处是: 程序启动快,内存占用小,包体小
JIT是运行开一个线程,一边编译一边执行,一般以函数为单位,编译过的机器码会缓存起来,下一次用到时直接取用。


IOS禁用JIT的原理是:禁用了堆上的代码执行权限。


参考资料:
1,https://www.zhihu.com/question/23874627
2,https://www.jianshu.com/p/a07bd632337a
3,https://www.cnblogs.com/murongxiaopifu/p/4278947.html


利用domain进行热更的原理:
https://www.cnblogs.com/Leo_wl/p/4255533.html

 

unity热更- 2 游戏大版本更新和热更新
https://blog.csdn.net/u014748818/article/details/78812728?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

 

Unity Android 动态更新 Assembly-CSharp.dll
http://blog.sina.com.cn/s/blog_9e5d42ee0102vvtg.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程主要是针对ILRuntime设计一个独立的脚本新框,框架的优势:1.将代码脱离Assetbundle资源,独立的部分适用于各种不同的框架。2.加快项目的逻辑新,bug修复.(后期修bug,多数情况下并不用动到资源,只需要新脚本代码,无需重走资源打包发布流程,大大提升效率)3.提供模式和正常开发模式的快速切换接口,可以让队友像平常一样去开发.4.不依赖市面上的任何AB框架,完全兼容市面上各种不同的AB框架.5.重点:希望通过它,帮助你学习、了解ILRuntime真正在项目中的应用.框架的将提供以下这些接口,这些接口将从0开始,在Unity里将C#脚本编译成dll,然后将dll放到服务器上,再将dll下载下来,进行加载,到最后从Unity主工程调用新的代码逻辑.1.Create hotfixdll接口将部分的代码 编译成dll生成dll版本配置(MD5)2.新对比接口本地跟服务器的dll进行版本对比3.下载dll下载dll本身的文件下载版本记录文件4.加载dll加载dll实例化:AppDomain初始化:注册跨域继承适配器注册委托适配器LitJson重定向调用性能优化(CLR绑定功能)调用接口Hotfix.HotfixApplication.Main 进入逻辑5.ILMonoBehaviour用于监听组件的生命周期,实际是桥接(调用)的逻辑AwakeStartEnableUpdateLateUpdate.......6.添加其他常用的库DOTweenLitJsonSpineGoogle.ProtobufTextAnimation可以根据上面的方式,自行添加依赖的库... 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值