首页 > 其他分享 >Unity是如何跨平台的

Unity是如何跨平台的

时间:2024-05-20 10:32:15浏览次数:24  
标签:编译器 Mono 代码 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和功能接口、跨平台打包和发布工具以及统一的资源管理和加载机制,实现了跨平台开发的原理。这些技术和工具使得开发人员能够更加高效地在不同平台上构建、发布和运行游戏。

 

标签:编译器,Mono,代码,Unity,如何,跨平台,运行
From: https://www.cnblogs.com/weigangblog/p/18201351

相关文章

  • Unity渲染管线的流程
    来自https://www.jianshu.com/p/02eebbf9ad9a 渲染管线的流程是在GPU中进行的,它主要占有计算机的显存部分。渲染管线在这个过程中进行了顶点处理、面处理、光栅化、像素处理。 1.顶点处理3D模型是由众多点构成的面展现出来的。顶点处理:是通过一系列坐标系的变换,让每个......
  • 如何正确实现一个自定义可序列化的 Exception
    最近在公司的项目中,编写了几个自定义的Exception类。提交PR的时候,sonarqube提示这几个自定义异常不符合ISerializablepatten.花了点时间稍微研究了一下,把这个问题解了。今天在此记录一下,可能大家都会帮助到大家。自定义异常#编写一个自定义的异常,继承自Exception,其中......
  • Unity中的OnApplicationPause和OnApplicationFocus
    OnApplicationPause游戏进入后台和返回前台//游戏进入后台时执行该方法pause为true切换回前台时pause为falsevoidOnApplicationPause(boolpause){if(pause){//切换到后台时执行}else{//切换到前台时执行,游戏启动时执行一次}}......
  • Unity遮挡剔除使用
    (1)设置对象为遮挡物or被遮挡物选中某个对象后,在其Occlusion窗口可以设置其Occluder Static和OccludeeStatic属性:遮挡物通过勾选一个对象的OccluderStatic可将其设置为静态遮挡物。理想的遮挡物应该是实心的,体积较大的物体。原则1:可能阻挡到其它对象的对象才应该被设置......
  • 【一步步开发AI运动小程序】十七、如何识别用户上传视频中的运动、动作、姿态?
    【云智AI运动识别小程序插件】,可以为您的小程序,赋于人体检测识别、运动检测识别、姿态识别检测AI能力。本地原生识别引擎,内置10余个运动,无需依赖任何后台或第三方服务,有着识别速度快、体验佳、扩展性强、集成快、成本低的特点,本篇实现需要使用此插件,请先行在微信服务市场或官网了......
  • 如何利用 Seaborn 实现高级统计图表
    本文分享自华为云社区《使用Seaborn实现高级统计图表从箱线图到多变量关系探索》,作者:柠檬味拥抱。在数据科学和数据可视化领域,Seaborn是一个备受欢迎的Python可视化库。它建立在Matplotlib的基础之上,提供了更简洁、更美观的图形界面,同时也具备了一些高级统计图表的功能。......
  • go高并发之路——go语言如何解决并发问题
    一、选择GO的原因作为一个后端开发,日常工作中接触最多的两门语言就是PHP和GO了。无可否认,PHP确实是最好的语言(手动狗头哈哈),写起来真的很舒爽,没有任何心智负担,字符串和整型压根就不用区分,开发速度真的是比GO快很多。现在工作中也还是有一些老项目在使用PHP,但21年之后的新项目基本......
  • 在Linux中,如何设置环境变量?
    在Linux中设置环境变量可以通过多种方式完成,包括临时设置和永久设置。以下是一些常用的方法:1.临时设置环境变量使用export命令可以在当前shell会话中设置环境变量。这个设置只会影响当前会话和由此启动的子进程。exportVARIABLE_NAME="value"例如,设置PATH环境变量以包含一......
  • 在Linux中,如何找出最大的文件或目录?
    在Linux中,查找最大的文件或目录可以通过一些命令行工具轻松实现。这里介绍几种常用的方法:1.查找最大的文件使用du和sort命令:首先,使用du命令计算指定目录下所有文件和子目录的大小,并结合sort命令按大小排序。示例:查找当前目录下最大的10个文件du-ah.|sort-rh|h......
  • 在Linux中,如何查看系统运行时间?
    在Linux中,查看系统的运行时间(也称为系统启动时间)可以通过多种命令实现。以下是一些常用的方法:1.uptime命令uptime命令提供了一个快速的概览,显示了系统运行时间、当前时间、用户数量以及系统的负载平均值。uptime输出示例:21:34:02up10days,2:58,1user,loadaverag......