Unity3D在iOS下为啥不能更新的资料收集

本文介绍了Mono作为跨平台工具的基本概念和技术原理,包括CIL通用中间语言的作用及编译过程,解释了Mono如何通过AOT和JIT编译实现跨平台支持,并探讨了iOS平台上AOT模式的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 几个基本概念
    • Mono 是什么鬼?

Mono是一个.Net工具,包括c#编译器和共通语言执行平台,可运行在winodws linux mac unix各种平台,其虚拟机包含一个实时编译引擎, Unity3d就是用mono这个东西实现跨平台的估计

    • CIL(Common Intermediate Language通用中间语言)

CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行,就像.NET是微软对这一标准的实现,Mono则是对CLI的又一实现。由于CIL能运行在所有支持CLI的环境中,例如刚刚提到的.NET运行时以及Mono运行时,也就是说和具体的平台或者CPU无关。这样就无需根据平台的不同而部署不同的内容了。

代码的编译分两个部分:

      1. 从代码本身到CIL的编译(其实之后CIL还会被编译成一种位元码,生成一个CLI assembly)
      2. 运行时从CIL(其实是CLI assembly,不过为了直观理解,不必纠结这种细节)到本地指令的即时编译(这就引出了为何U3D官方没有提供热更新的原因:在iOS平台中Mono无法使用JIT引擎,而是以Full AOT模式运行的,所以此处说的额即时编译不包括IOS
    • Mono的AOT?

Ahead of Time (AOT) 提前编译来减少JIT的工作量,(JIT: Just In Time Compile,即时编译器)但默认情况下AOT并不编译所有IL代码,而是在优化和JIT之间取得一个平衡。在iOS中,Mono是以Full AOT模式运行的,无法使用JIT引擎。iOS平台是禁用JIT引擎的,于是Mono在iOS上需要Full AOT编译和运行。即预先对程序集中的所有IL代码进行AOT编译生成一个本地代码映像,然后在运行时直接加载这个映像而不再使用JIT引擎。(其实严格来说,iOS没有禁止JIT,而是封锁了内存(或堆)的可执行权限,就相当于变相封锁了JIT这种编译方式)

    • 过程总结
 应该分3步:
1. c# --->  CIL
2. CIL ---> 位元码
3. 第三步有两种形式: 
  --->  JIT    位元码 给虚拟机执行
  ----> AOT  位元码 --->  不同平台原生代码 直接平台执行
而JIT这种方式是被iOS禁止的,只能用AOT模式在运行前先编译好(当然AOT编译阶段也是用到JIT的引擎)
基本是这样 
    • 反射 && 与Mono有啥关系?

.Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息

  • System.Reflection.Emit 可动态构建程序集和类型的所有框架类的根,在需要时动态的产生代码。(注意:反射发出(reflection emit)并不能产生源代码。换句话说,你在这里的努力并不能创建VB.Net或者C#代码。相反,反射发出(reflection emit)类会创建MSIL op代码。---> 即微软中间语言,类似CIL啦),然而是没有卵用的,假设你将一个可能会更新c#类放在某个DLL里面,运行时LoadDLL然后实例化出这个类使用,生成MSIL代码,但是iOS并不支持JIT,所以代码也没法用啊...
  • 所以说反射的API都可以用,但是其实对于做热更新是没有意义的....大概说的就是这个意思吧(我猜测的)
  • C#中的反射的主要用途有:

1. 需要访问程序元数据的属性

2.检查和实例化程序集中的类型。

3.在运行时构建新类型。

4.执行后期绑定,访问在运行时创建的类型的方法。

猜测反射就是Mono使用JIT的主要技术

  • Reflection.Emit与反射?

TODO?

    • uLua(asset store)使用的反射机制?

TODO?

    • ulua & cstolua 

 静态方法,性能优越?

    • iOS为啥不支持JIT?

No Dynamic Code Generation
Since the iPhone's kernel prevents an application from generating code dynamically Mono on the iPhone does not support any form of dynamic code generation.

至于为什么不支持,就不懂了... 反正iOS不支持,Unity3D和Mono都不会公开支持

  • Unity3D与cocos2dx更新有啥不一样?

TODO?

转载于:https://www.cnblogs.com/atenza/p/4897174.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值