浅谈Unity与.Net、Mono、IL2CPP

2023-10-24 06:11
文章标签 unity 浅谈 net mono il2cpp

本文主要是介绍浅谈Unity与.Net、Mono、IL2CPP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:什么是.Net?

.Net是微软的一种技术平台/一种规范,而不是一种语言,可以理解为接口
.NET平台支持多种语言开发:C#、F#、Visual Basic等
目前.Net有三种主流实现
——.Net Framework:主要是基于Windows上开发
——.Net Core:支持跨平台开发
——Mono:支持跨平台开发


二:.Net代码在Mono下的编译过程

首先我们写的代码通过特定语言的编译器编译成CIL(Common Intermediate Language:中间语言,字节码,也可以称为IL或CIL),它是一种托管代码类似于Java的虚拟机,它会存储在.DLL或.EXE的程序集中,CIL是一种伪代码不能被计算机直接识别。它与平台操作系统无关与CPU无关是一种中间语言,这也为跨平台奠定了基础。之后在程序运行时再通过CLR(Common Language Runtime:公共语言运行时)内部的JIT编译器将CIL编译成计算机可以识别的CPU指令(机器码:01010101),IL语言是在CLR中运行的,而CLR并不知道IL是由哪种语言编译而来
这是一个二次编译的过程

我们知道程序运行时候需要占用计算机的内存,C++的程序员是需要自己手动操作管理内存的,需要自己分配和释放内存。但是.NET程序员是不需要进行这个操作的,这是因为CLR帮我们自动做了分配内存和释放内存的操作

托管代码与非托管代码:
例如C#,Java等,托管代码包含中间语言,需要经过虚拟机/CLR转换为CPU指令,代码执行效率低,但是它不依赖于操作系统和CPU,在各个操作系统上都能执行,它是运行在虚拟机/CLR上的
例如C++等,非托管代码是直接对接CPU指令,代码执行效率高,但是不同的操作系统需要单独编写代码,C++能跨平台可以理解为每个平台都有实现C++编译器


三:什么是Mono?

因为.Net Framework本身只能在Windows平台上运行,对于跨平台的需求Mono就产生了
Mono是基于CLI和C#的ECMA标准提供的.Net的另一种实现,与.Net不同的是它将CLR在所有支持的平台上重新实现了一遍(安卓、Switch,PS4)并且还将.Net Framework提供的基础类库也重新实现了一遍
Unity能够跨平台的并不是因为C#这种语言能够跨平台,而是通过Mono实现了跨平台,Mono将C#代码又实现了一遍并在运行时运行在Mono虚拟机上


四:Mono的组成

——C#编译器:C#编译器称为mcs,可以完成C#的编译工作,作用就是将C#源码编译成中间语言CIL,在非Windows平台上需要Mono运行时来运行,而在Windows平台上既可以用.Net运行时,也可以使用Mono运行时
——Mono运行时(Mono VM): 实现了ECMA公共语言架构,提供了一个即时编译器(JIT)、预编译器(AOT)、类库加载器、垃圾回收器、线程系统和互操作性功能
——基础类库(.Net类库):提供一组全面的类,这些类兼容.Net框架并保持一致,是构建程序的结实基础
——Mono类库:提供了很多超越基础类库的类,提供了额外的功能,例如一些处理Gtk+,Zip文件,LDAP,OpenGL、Cairo、POSIX等等


五:什么是Mono运行时?

C#编译器mcs的作用是将C#源码编译成中间语言CIL,Mono运行时的作用是将CIL转换成机器语言
Mono运行时提供了三种转译方式
——即时编译(JIT):在运行过程中,将CIL编译成机器码。它是在程序运行时才编译代码,解释一条语句执行一条语句,同时也会将编译过的代码进行缓存,而不是每一次都进行编译
——提前编译(AOT):在运行前,将CIL编译成机器码并储存起来,但还是有一部分编译需要用到JIT
——完全静态编译(Full AOT):在运行前,将所有CIL编译成机器码,例如在IOS平台上是禁止JIT的,所以Mono只能以Full AOT模式运行
在这里插入图片描述


六:IL2CPP

在得到中间语言IL后,使用IL2CPP将IL转换成C++代码,然后再由各个平台的C++编译器直接编译成机器码
IL2CPP很好理解:将IL代码转换成C++代码
那为什么Unity要把IL再转回静态的CPP呢?原因如下:
——Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成
Mono的跨平台是通过Mono VM实现的,有几个平台,就要实现几个VM,像Unity这样支持多平台的引擎,Mono官方的VM肯定是不能满足需求的。所以针对不同的新平台,Unity的项目组就要把VM给移植一遍,同时解决VM里面发现的bug,这非常耗时耗力。而且有些平台无法进行移植。
L2CPP的虚拟机的出现是因为之前没有内存回收的代码,转换为静态C++代码后也是没有的,所以需要通过L2CPP的虚拟机提供内存管理等服务,但是它不像Mono虚拟机,去除了IL加载和动态解析的工作,使得IL2CPP VM可以做的很小,并且使得游戏载入时间缩短
——提高运行效率
因为各个平台的C++编译器对代码执行有优化,它的运行效率通常比Mono虚拟机下的运行效率更高


七:Mono和IL2CPP总结

——IL2CPP只支持AOT方式,Mono支持AOT,JIT所有方式
——平台支持:Android平台支持Mono和IL2CPP的所有编译方式,而IOS禁止为动态分配内存赋予执行权限,只支持Mono的Full AOT模式和IL2CPP 
——IL2CPP也有一些限制,因为C++是静态语言,所以只能使用AOT编译,从而不支持一些动态代码生成和反射的高级功能

这篇关于浅谈Unity与.Net、Mono、IL2CPP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/273221

相关文章

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器