Unity3d:c#,Mono,IL2CPP,托管代码,AOT,JIT

Mono

跨平台

IL

Intermediate Language,中间语言,面向对象的汇编语言

工作流

通过C#编译器mcs,将C#编译为IL(中间语言,byte code)
通过Mono运行时中的编译器将IL编译成对应平台的原生码

IL三种转译方式

即时编译(Just in time,JIT):程序运行过程中,将CIL的byte code转译为目标平台的原生码。
提前编译(Ahead of time,AOT):程序运行之前,将.exe或.dll文件中的CIL的byte code部分转译为目标平台的原生码并且存储,程序运行中仍有部分CIL的byte code需要JIT编译。
完全静态编译(Full ahead of time,Full-AOT):程序运行前,将所有源码编译成目标平台的原生码。

Unity跨平台的原理

Mono运行时编译器支持将IL代码转为对应平台原生码
IL可以在任何支持CLI,通用语言环境结构)中运行,IL的运行是依托于Mono运行时。

IOS不支持jit编译原因

机器码被禁止映射到内存,即封存了内存的可执行权限,变相的封锁了jit编译方式

托管代码

c#代码生成的IL编码,由虚拟机的JIT编译执行,其中对象无须手动释放,由GC管理

非托管代码

C++/C#中以不安全类型写的代码,虚拟机无法跟踪

托管代码剥离

在这里插入图片描述

托管代码剥离过程将分析项目中的程序集,以查找和删除未实际使用的代码。分析过程使用一组规则来确定要保留的代码和要丢弃的代码。这些规则将在构建大小(包含太多代码)与风险(删除太多代码)之间进行权衡。Managed Stripping Level 设置可用于控制删除代码的激进程度。

Mono构建

  1. 构建应用非常快
  2. 由于Mono的JIT(Just In Time compilation ) 机制, 所以支持更多托管类库
  3. 支持运行时代码执行
  4. 必须将代码发布成托管程序集(.dll 文件 , 由mono或者.net 生成 )
  5. Mono VM在各个平台移植异常麻烦,有几个平台就得移植几个VM(WebGL和UWP这两个平台只支持 IL2CPP)
  6. Mono版本授权受限,C#很多新特性无法使用
  7. iOS仍然支持Mono , 但是不再允许Mono(32位)应用提交到Apple Store
    在这里插入图片描述

IL2CPP

  1. 相比Mono, 代码生成有很大的提高
  2. 可以调试生成的C ++代码
  3. 可以启用引擎代码剥离(Engine code stripping)来减少代码的大小
  4. 程序的运行效率比Mono高,运行速度快
  5. 多平台移植非常方便
  6. 相比Mono构建应用慢
  7. 只支持AOT(Ahead of Time)编译
    在这里插入图片描述

IL2CPP概括:

  1. Mono将c#翻译成IL
  2. IL2CPP得到IL转变为C++代码
  3. 再由各个平台C++编译器编译成可执行机器码
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四夕立羽

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值