Unity底层处理C#代码的两种方式

Unity底层处理C#代码的两种方式分别是Mono虚拟机和IL2CPP。

Mono虚拟机:

        Mono虚拟机是Unity默认使用的脚本解释和编译方式,它将C#代码编译成中间语言(IL),然后通过JIT(即时编译)或AOT(预编译)技术将其转换为本地机器码,最终在计算机上执行。这个过程可以分为以下几个步骤:

  • 编写C#脚本:开发者使用C#语言编写游戏逻辑代码。
  • 编辑器自动编译:Unity编辑器自动将C#脚本编译成DLL文件,并添加到游戏项目中。
  • Mono虚拟机解释执行:当游戏运行时,Mono虚拟机会解释并执行DLL文件中的C#代码,将其转换为本地机器码执行。

 IL2CPP:

IL2CPP是Unity另一种脚本解释和编译方式,它将C#代码编译成C++代码,并生成可执行文件。相比于Mono运行时,IL2CPP可以提供更高的性能和更广泛的平台支持。这个过程可以分为以下几个步骤:

  • 编写C#脚本:开发者使用C#语言编写游戏逻辑代码。
  • 编辑器自动编译:Unity编辑器自动将C#脚本编译成中间语言(IL)的DLL文件,并添加到游戏项目中。
  • IL2CPP转换为C++代码:当游戏发布时,IL2CPP会将IL代码转换为C++代码,并进行优化和减少体积处理。
  • 编译可执行文件:生成可执行文件并运行。

 为什么使用Mnno虚拟机,又为什么开发IL2CPP?

C#的历史:

        C#没有出现之前,Java凭借Java虚拟机+Java字节码解释执行,让Java代码移植编写可以跨平台运行,同时Java还有了垃圾回收机制等,大大的降低了开发的难度。微软为了应对Java, 推出了.net平台。

        在微软开放.NET后,Mono是其平台下的.NET项目,支持Linux,Windows和Mac,Android,因此基于Mono开发应用/游戏都是可以跨平台发布。

        所以早期的Unity选择了Mono作为跨平台基础。而mono基于.net技术构建,所以在mono上开发,可以支持多种开发语言,c#,J#等。所以早期Unity能支持C#, Boo, Js等编程语言,都是基于mono .net技术。Mono帮助Unity解决了跨平台问题,开发语言与开发工具的问题。

        后来Unity发现了Mono虚拟机出现了多个问题,因此开发了IL2CPP:

  1. Mono.Net的版权问题,当Unity使用Mmh ono的时候,需要Mono的授权;
  2. Mono虚拟机解释执行.NET字节码,运行效率相对较差;
  3. IOS等部分平台不允许内置.NET虚拟机;
  4. 如果有新的计算平台出现,且Mono不支持,那么Unity就需要重新移植Mono虚拟机;

猜你喜欢

转载自blog.csdn.net/HimaRe1/article/details/131098334