前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity3d:c#,Mono,IL2CPP,托管代码,AOT,JIT

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

作者头像
立羽
发布2023-08-24 15:25:24
4500
发布2023-08-24 15:25:24
举报
文章被收录于专栏:Unity3d程序开发Unity3d程序开发

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++编译器编译成可执行机器码
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Mono
  • IL
  • 工作流
  • IL三种转译方式
  • Unity跨平台的原理
  • IOS不支持jit编译原因
  • 托管代码
  • 非托管代码
  • 托管代码剥离
  • Mono构建
  • IL2CPP
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档