Unity是如何跨平台的

做游戏肯定要跨平台,Unity是如何实现跨平台的,这就得提到Unity脚本后端处理(Scripting Backend)的两种方式Mono和IL2Cpp
 
Mono组成组件:C#编译器,CIL虚拟机,核心类别的程序库,Mono的编译器负责生成符合公共语言规范的映射代码

Mono打包的主要流程:c# script,unity spcript 和第三方库代码,通过编译器转成 il code中间语言,这时aot与与jit两种变异模式就产生的差别,jit模式下il与mono虚拟机会一起打入包中,il code在应用程序中通过mono虚拟机解释代码将指令映射到虚拟内存执行(ios下禁止这一行为),而aot模式会生成相应平台的机器码,不会将mono虚拟机打入包中。使用 Mono AOT 编译模式可以提高应用程序的启动速度和运行时性能,因为它将 IL 代码编译为本地机器码,减少了运行时的解释和优化过程。这使得应用程序在设备上的运行更加高效和稳定。
一般不会结合jit、aot两种方式打包,除非有特特殊的需求,并且需要额外的复杂逻辑处理

IL意思是中间语言,是.Net框架的中间语言,.NET提供的编译器可以直接将源码编译成.exe或.dll文件,但此时编译出来的程序代码并不是CPU直接执行的机器代码,而是中间语言IL代码。
IL代码编译器ILDasm

il2cpp打包的主要流程:c# script,unity spcript 和第三方库代码,通过编译器转成 il code中间语言,IL2CPP工具 将 il code转换为等效的 C++ 代码,并保留类型信息、方法调用等关键信息。生成的 C++ 代码经过优化和整理后生产本地源码,生成的本地源码包含了一些运行时库(所谓的il2cpp运行时库)的功能,将 .NET 的垃圾回收等功能嵌入到生成的 C++ 代码中,以便在运行时管理内存的分配和释放,

因此,IL2CPP 的运行时库在应用程序运行时起作用,它们负责处理应用程序的运行时行为,包括内存管理、类型转换、异常处理等。这些库是作为编译后的应用程序的一部分打包到最终的可执行文件中的,而不是作为独立的组件进行加载。

 

Unity是如何实现跨平台的:
Mono运行时编译器支持将IL代码转换为对应平台的原生码,IL可以在任何支持CLI,通用语言环境结构中运行,IL的运行是依托于Mono运行时
 
IOS不支持jit编译的原因
机器码被禁止映射到内存,即封存了内存的可执行权限,变相的封存了jit编译方式
 

Unity实现跨平台的原理主要包括以下几个方面:

  1. 虚拟机和中间层:Unity引擎使用了虚拟机和中间层技术,这些技术能够将游戏逻辑和代码与底层操作系统隔离开来。这样一来,开发人员编写的游戏代码可以在不同平台上运行,而无需针对每个平台进行特定的优化或修改。

  2. 统一的API和功能接口:Unity提供了一套统一的API和功能接口,这些接口能够在不同平台上进行适配和映射,确保游戏在各个平台上都能正常调用系统功能、设备硬件和图形渲染等。

  3. 跨平台打包和发布:Unity引擎内置了跨平台的打包和发布工具,开发人员可以使用这些工具将游戏项目打包成适用于不同平台的可执行文件或安装包。这些工具会处理不同平台之间的差异,确保游戏能够在各个平台上正确运行。

  4. 统一的资源管理和加载:Unity提供了统一的资源管理器和加载机制,开发人员可以使用相同的资源文件在不同平台上进行加载和应用。这简化了跨平台开发中的资源管理和优化工作。

总的来说,Unity通过虚拟机和中间层技术、统一的API和功能接口、跨平台打包和发布工具以及统一的资源管理和加载机制,实现了跨平台开发的原理。这些技术和工具使得开发人员能够更加高效地在不同平台上构建、发布和运行游戏。

 
posted @ 2024-05-20 10:23  weigang  阅读(220)  评论(0编辑  收藏  举报