【unity】unity跨平台原理

跨平台

跨平台的含义是指一次编译,各个平台都可以运行。

C/C++语言不能一次编译到处执行,因为C/C++的编译的结果是针对特定平台操作系统、处理器指令集而生成的本地代码(native code),那么不同操作系统和处理器(事实上x86处理器的指令集都是兼容的)的本地代码是不一样的,自然也就不可能一次编译到处执行。

而直接解释执行的脚本语言,因为不存在编译到本地代码这一过程,所以也不存在跨平台的问题。

C#/Java发明了一种叫做中间语言(IL,.NET是CIL,Java是ByteCode)的东西,中间语言与特定的操作系统和处理器指令集都没有关系,C#/Java在编译时,是编译成为一种低阶的语言,即IL。
然后通过在特定平台的运行时程序(CLR和JRE),解释和编译IL来执行

既然.NET的C#已经跨平台了,为什么还会有mono,因为早期微软为了推广window把.NET绑死在windows上。(来源网络)

参考链接:Java、C#、.NET Framework、Mono 是如何跨平台的? - 知乎

Mono

将代码处理为IL,使用自己Mono VM虚拟机运行,实现支持更多的平台。
是个民间组织,后面被巨硬收购了。

优点:
出包速度快
包体略小
必须将代码发布成托管程序集(.dll文件,由mono或者.net生成)。
支持安卓上dll动态载入程序集热更新
缺点:
但维护困难、版权限制,而低版本的mono就无法使用C#的强大特性;
mono需要运行在虚拟机内,相比于编译成原生的CPP代码而言,效率非常低。

IL2CPP

由 Unity 开发的脚本后处理(Scripting Backend)。IL2CPP.exe将脚本和程序集内的 IL 代码转换为 C++,然后为所选平台创建本机二进制文件(例如 .exe、apk、.xap)。
本身包含了IL2CPP VM虚拟机进行内存管理和执行代码。可提高项目的性能、安全性和平台兼容性。

官方说明:IL2CPP Overview - Unity 手册

优点:
可以调试生成的C ++代码。
可以启用引擎代码剥离(Engine code stripping)来减少代码的大小。
程序的运行效率比Mono高,运行速度快。
多平台移植非常方便。
缺点:
相比Mono构建应用慢。
只支持AOT(Ahead of Time)编译。(静态语言)

参考链接:Unity之IL2CPP - 知乎

.NET

一种跨平台、高性能的开源实现。 包括公共语言运行时 (CLR)、AOT 运行时(正在开发中的 CoreRT)、基类库 (BCL) 以及 .NET SDK
早期版本称为.NET Core。 .Net 5.0 是继 .NET Core 3.1 之后的下一版本。
跳过了版本 4,以避免将此较新的 .NET 实现与称为 .NET Framework 的旧实现混淆。 .NET Framework 的当前版本为版本 4.8。

.NET Framework
这个包含了很多东西并不是都跨平台
仅在 Windows 上运行的 .NET 实现。 包括公共语言运行时 (CLR)、基类库 (BCL) 以及应用程序框架库(例如 ASP.NET、Windows 窗体和 WPF)。

.NET官方说明 .NET(和 .NET Core)- 简介和概述 | Microsoft Docs

C#:

C#是.NET的编程语言之一
C#代码编写好之后被C#编译器编译成IL代码,然后IL代码被CLR运行时(JIT,AOT两种编译模式)编译成本机代码.但.net framework因为特定的依赖是能在windows上运行,于是Mono为了跨平台就诞生了. 

CLR

公共语言运行时(Common Language Runtime)。 
CLR 处理内存分配和管理。 CLR 也是一个虚拟机,不仅可执行应用,还可使用实时 JIT 编译器生成和编译代码。

NET CLR 和 Java VM 都是堆叠式虚拟机器(Stack-Based VM),也就是說,它們的指令集(Instruction Set)都是採用堆叠运算的方式:执行时的资料都是先放在堆叠中,再进行运算。JavaVM 有約 200 個指令(Instruction),每個指令都是 1 byte 的 opcode(操作码),后面接不等数目的参数;.NET CLR 有超過 220個指令,但是有些指令使用相同的 opcode https://www.jb51.net/article/39635.htm

IL

中间语言Intermediate Language
.NET将较高级语言(C#)编译为 无关硬件指令集(hardware-agnostic instruction set)的 中间语言 (IL)。
通过IL中间语言这种方式,可以实现跨平台、提高程序灵活性等多种优点。

JIT

即时编译 just-in-time。
JIT 编译器知道实际硬件,这样开发人员就无需为不同平台提供不同的实现。

AOT

预编译器
大多数 .NET 工作负载的默认体验是 JIT 编译器,但 .NET 提供两种形式的预先 (AOT) 编译:

  • 某些场景需要 100% AOT 编译。 例如 iOS
  • 在其他情况下,应用的大多数代码都是 AOT 编译的,但有些代码是 JIT 编译的。 某些代码模式不适用于 AOT(如泛型)。 这种形式的 AOT 编译的示例为准备运行发布选项。 这种形式的 AOT 具有 AOT 的优点并且没有 AOT 的缺点。

assembly

程序集
.dll 或 .exe 文件,其中包含一组可由应用程序或其他程序集调用的 API 。
程序集可以包括接口、类、结构、枚举和委托等类型。 有时,项目的 bin 文件夹中的程序集被称为二进制文件。 另请参阅

指令集

指令集_百度百科

参考链接
mono与il2cpp介绍 Unity将来时:IL2CPP是什么?有了Mono为什么还需要IL2CPP?_-阿龙-的博客-CSDN博客_mono和il2cpp
mono与il2cpp详解 Unity3d跨平台原理是什么? - 知乎
.NET术语  .NET 术语表 | Microsoft Docs

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值