Unity C#的底层原理概述

文章目录


前言

看到底层二字,会感到很高深,好似下一秒就要踏入深渊。实际上,对于C#底层的理解非常简单,比冒泡排序这种基础算法还要简单。
底层的两种机制:Mono和IL2CPP。

IL2CPP其中的"2"我们念做,念做 “to”,含义就是"转为"。xx2yy也就是把xx转为yy。


IL与IL2CPP

在Unity中使用C#语言的一个重要好处是编译速度快且开发效率高。虽然.NET框架原本只能在Windows上运行,但随着C#被ISO标准化,开发者可以借助CLI实现跨平台兼容。Mono项目就是在这种背景下诞生的,旨在实现跨平台.NET 4.0的完整功能支持。与微软的.NET Framework不同,Mono不仅可以在Windows上运行,还能在Linux、FreeBSD、Unix、OS X等系统上运行,甚至支持一些游戏平台,如Playstation 3、Wii或XBox 360,这使得C#具备了出色的跨平台能力。
Unity脚本也是经过各自的编译器编译成符合CLI规范的中间语言(IL),然后由Mono虚拟机进行解释和执行。

为什么后续增加了IL2CPP机制?
原因有三:
1、维护成本大

维护Mono虚拟机在不同平台上的成本巨大,需要处理各种平台的移植和适配问题。每次新增一个平台,都需要投入大量人力和资源进行移植工作,有时甚至无法完成。特别是对于基于浏览器的平台,如WebGL,移植工作几乎不可能完成。

2、版本受限
许多C#新特性无法支持。

IL2CPP优点:
1、模块化设计:IL2CPP 的架构模块化,使得可以相对容易地对其进行扩展和更新。当 C# 或 .NET Framework 中引入新的特性时,IL2CPP 可以通过更新相应的模块来支持这些新特性。
2、与标准兼容性:IL2CPP 遵循 CLI(Common Language Infrastructure)标准,这意味着只要新的 C# 特性符合 CLI 标准,IL2CPP 就可以支持它们。因此,只要 C# 语言本身引入了新的特性并且符合 CLI 标准,IL2CPP 就可以相应地进行支持。
3、持续更新:Unity 的开发团队会不断地更新 IL2CPP,以确保它能够支持最新的 C# 特性。这意味着当 C# 或 .NET Framework 更新时,Unity 也会相应地更新 IL2CPP,以确保开发者可以使用最新的语言特性。

3、性能优化
运行效率大幅提升(2倍左右)。

Mono将C#语言翻译成IL,而IL2CPP则将IL代码转换回C++代码。这些生成的C++代码会被传递给各个平台的C++编译器,最终编译成可执行的机器码。

IL2CPP将C#代码转换为C++代码,然后再编译成机器码。虽然IL2CPP有自己的虚拟机,但它不执行JIT或者翻译代码,主要用于内存管理。在使用IL2CPP时,程序员不需要担心Mono和IL2CPP之间的内存差异。与Mono类似,IL2CPP也可以在不支持JIT的操作系统中使用,因为它绕过了JIT,将C#代码静态编译成C++代码,最终生成二进制机器码。


总结

一句话总结,IL2CPP的引入主要是为了解决Mono维护成本高、版本受限以及性能优化等问题。IL2CPP通过将C#代码转换为C++代码,再编译成机器码的方式,实现了跨平台的支持,并且能够更好地适配新的C#特性。

相关推荐

  1. Unity C#底层原理概述

    2024-04-30 08:14:03       13 阅读
  2. docker底层原理

    2024-04-30 08:14:03       27 阅读
  3. 【Vue】实现底层原理

    2024-04-30 08:14:03       20 阅读
  4. HashMap底层工作原理(详细版)

    2024-04-30 08:14:03       25 阅读
  5. spring中事务及底层原理

    2024-04-30 08:14:03       43 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 08:14:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 08:14:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 08:14:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 08:14:03       18 阅读

热门阅读

  1. 小米金融守护消费权益,共筑金融和谐新篇章

    2024-04-30 08:14:03       9 阅读
  2. Ajax 解决浏览器缓存问题原理和例子

    2024-04-30 08:14:03       9 阅读
  3. 指数分布、瑞利分布和Nakagami-m的联系

    2024-04-30 08:14:03       9 阅读
  4. 在Mac上使用国内源安装 homebrew

    2024-04-30 08:14:03       10 阅读
  5. elementUI之el-select选择器赋值为空后无法选中回显

    2024-04-30 08:14:03       8 阅读
  6. 介绍一个在数据分析中常用的函数:data.iloc[]

    2024-04-30 08:14:03       13 阅读
  7. Tomcat Bootstrap init()

    2024-04-30 08:14:03       10 阅读
  8. CAPM模型特点

    2024-04-30 08:14:03       8 阅读
  9. Google云平台(Google Cloud Platform,简称GCP)

    2024-04-30 08:14:03       13 阅读