Unity跨平台基本原理

目录

前言

​编辑

Mono

Unity和Mono的关系

Unity跨平台必备概念

Mono利用

Mono主要构成部分

基于Mono跨平台的优缺点

IL2CPP

Mono和IL2CPP的区别

Mono

IL2CPP

Mono和IL2CPP的使用建议

安装IL2CPP

IL2CPP打包存在的问题

类型裁剪

泛型问题


前言

        Unity跨平台的基本原理主要基于其底层架构和Mono的运行机制。以下是对Unity跨平台基本原理的详细阐述。

Mono

Unity和Mono的关系

Unity公司于2004年成立。Unity的底层是通过C/C++来完成的,但是为了更方便的让开发者使用,
Mono在当时成为了不二之选,它同时具备跨平台和跨语言的两个特性。

Unity希望能有更多的开发者使用其进行游戏开发,并且一次开发一劳永逸,所以跨语言和跨平台对于他们来说是很重要的。虽然C++本身跨平台,但是如果使用C++作为上层逻辑开发语言,那么作为开发者来说选择性相对较少,并且对于初学者来说学习难度也较大,所以当时的Mono是非常满足Unity需求的不仅支持跨语言还支持跨平台。

Unity跨平台必备概念

Unity主要包括两个部分
Unity Engine(引擎)
包含平台相关代码提供UnityEngine.dll动态库,各平台不同,C/C++编写,图形AP1、物理引擎、灯光等等所有游戏引擎底层内容

Unity Editor(编辑器)
提供UnityEditor.dll动态库,大部分由C#编写,用户脚本最初可以使用C#JavaScript、Boo语言编写,项目代码最后由Mono编译

Mono利用

.Net平台制定的CLI公共语言基础结构规则,利用它我们可以把很多种语言编译成通用规范的CIL公共中间语言,再利用CLR公共语言运行时,将这些CIL公共中间语言转换为对应操作系统的原生代码。
这样用各种不同语言编写的逻辑就能够在指定操作系统上运行了,它的这一套规则是在.Net Framework规则上进行的修改和添加。

Mono主要构成部分

1.C#编译器(mcs)
2.Mono Runtime 类似CLR公共语言运行时(虚拟机)
包括JIT(Just in time)即时编译器、AOT(Ahead of time)提前编译器、GC、类库加载器 等等
3.BCL基础类库
4.Mono类库
提供很多超出.Net的一些额外功能,主要用于构建各种操作系统上的应用

在Unity下使用各种语言进行逻辑实现
这些语言在发布时会被编译成IL中间代码
最终这些中间代码在对应操作系统上
通过Mono VM(虚拟机)真正翻译成机器码运行起来

基于Mono跨平台的优缺点

优点:
只要在不同操作系统上实现MonoVM(虚拟机)
那我们能够支持的平台就会“无限”多

缺点:
维护工作耗时耗力,当Unity版本更新时,MonoVM也需要维护和更新
那多对于N多个平台来说,工作量是非常大的。(Unity的工作量)
低版本Mono无法支持新版本C#的强大新特性


IL2CPP

IL2CPP是在Unity4.6.1 p5之后的版本中加入的脚本后处理方式
你可以把它简单理解为是继Mono之后的一种跨平台解决方案
顾名思义就是把IL中间代码转译为CPP代码(C++)

通过IL2CPP我们可以将编译好的LL中间代码转译成C++代码
再利用各平台优化过的编译器编译为对应平台的目标代码

IL2CPP和Mono的区别就在于当生成了IL中间代码后
Mono是直接通过虚拟机转译运行
而IL2CPP的步骤多了一些
会将儿中间代码转译为C++代码
再通过各平台的C++编译器直接编译为可执行的原生汇编代码

需要注意的是
虽然中间代码变为了C++
但是内存管理还是遵循C#中GC的方式
这也是为什么有一个IL2CPP VM(虚拟机)存在的原因,它主要是用来完成GC管理,线程创建等服务工作的


Mono和IL2CPP的区别

Mono

1.构建(最终打包时)速度快
Oher I DLL

2.Mono编译机制是川T即时编译,所以支持更多类库

3.必须将代码发布为托管程序集(.d文件)

4.Mono VM虚拟机平台维护麻烦,且部分平台不支持(WebGL)

5.由于Mono版本授权原因,C#很多新特性无法使用

6.IOS支持Mono,但不在允许32位的Mono应用提交到应用商店

IL2CPP

1.相对Mono构建(最终打包时)速度慢

2.只支持AOT提前编译

3.可以启用引擎代码剥离来减少代码的大小

4.程序的运行效率比Mono高,运行速度快

5多平台移植更加方便

Mono和IL2CPP的最大区别就是IL2CPP不能在运行时动态生成代码和类型,所以必须在编译时就完全确定需要用到的类型。举例:List<A>和List<B>中A和B是我们自定义的类,我能必须在代码中显示的调用过,IL2CPP才能保留List<A>和List<B>两个类型。如果在热更新时我们调用List<C>,但是它之前并没有在代码中显示调用过,那么这时就会出现报错等问题。主要就是因为川T和AOT两个编译模式的不同造成的。


Mono和IL2CPP的使用建议

由于IL2CPP的运行效率有很大优势,所以建议大家在实际开发中直接使用IL2CPP模式进行打包


安装IL2CPP

编辑器中添加模块选择目标平台带有IL2CPP支持项的。


IL2CPP打包存在的问题

类型裁剪

IL2CPP在打包时会自动对Unity工程的DLL进行裁剪,将代码中没有引用到的类型裁剪掉,以达到减小发布后包的尺寸的目的。然而在实际使用过程中,很多类型有可能会被意外剪裁掉,造成运行时抛出找不到某个类型的异常。特别是通过反射等方式在编译时无法得知的函数调用,在运行时都很有可能遇到问题

解决方案:
1.IL2CPP处理模式时,将PlayerSetting->Other Setting->Managed Stripping Level(代码剥离)设置为Low


Disable:Mono模式下才能设置为不删除任何代码
Low:默认低级别,保守的删除代码,删除大多数无法访问的代码,同时也最大程度减少剥离实际使用的代码的可能性
Medium:中等级别,不如低级别剥离谨慎,也不会达到高级别的极端
Hight:高级别,尽可能多的删除无法访问的代码,有限优化尺寸减小。如果选择该模式一般需要配合link.xml使用

2.通过Unity提供的link.xml方式来告诉Unity引擎,哪些类型是不能够被剪裁掉的
在Unity工程的Assets目录中(或其任何子目录中)建立一个叫link.xml的XML文件

泛型问题

IL2CPP和Mono最大的区别,是不能在运行时动态生成代码和类型。就是说 泛型相关的内容,如果你在打包生成前没有把之后想要使用的泛型类型显示使用一次,那么之后如果使用没有被编译的类型,就会出现找不到类型的报错。

举例:List<A>和List<B>中A和B是我们自定义的类,我们必须在代码中显示的调用过,IL2CPP才能保留List<A>和List<B>两个类型。如果在热更新时我们调用List<C>,但是它之前并没有在代码中显示调用过,那么这时就会出现报错等问题。主要就是因为JIT和AOT两个编译模式的不同造成的。

List<A> list = new List<A>();
List<B> list2 = new List<B>();

 解决方案:
泛型类:声明一个类,然后在这个类中声明一些public的泛型类变量
泛型方法:随便写一个静态方法,在将这个泛型方法在其中调用一下。这个静态方法无需被调用,
这样做的目的其实就是在预言编译之前让IL2CPP知道我们需要使用这个内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/912592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【go从零单排】接口(interface)和多态(Polymorphism)

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在Go语言中&#xff0c;interface 是一种重要的类型&#xff0c;用于定义一组方法…

Science Robotics 综述揭示演化研究新范式,从机器人复活远古生物!

在地球46亿年的漫长历史长河中&#xff0c;生命的演化过程充满着未解之谜。如何从零散的化石证据中还原古生物的真实面貌&#xff1f;如何理解关键演化节点的具体过程&#xff1f;10月23日&#xff0c;Science Robotics发表重磅综述&#xff0c;首次系统性提出"古生物启发…

WPS文档中的“等线”如何删除

如何删除“等线”占用的行如何删除表格之间的空行WPS文档中的“等线”是什么如果删除脚注文本占用的行 如下这种&#xff0c;在文档中添加了表格和脚注&#xff0c;发现上下表格之间有多行空行&#xff0c;鼠标选中&#xff0c;显示是“等线”&#xff0c;那么如何去除等线占用…

开源办公软件OnlyOffice的使用教程以及8.2版本的更新功能测评

OnlyOffice 8.2 是一款功能全面的在线办公套件&#xff0c;在实际使用中&#xff0c;PDF协作编辑功能给我留下了深刻印象&#xff0c;让团队成员能够轻松共同编辑PDF并签署文档。这些改进不仅增强了协作效率&#xff0c;也让办公体验更加流畅和高效。如果你的团队需要一个集协作…

C/C++/PYTHON 改变 console terminal cmd 字体输出颜色

C代码 #include <stdio.h>// 定义一些常用颜色的转义序列 #define RED "\x1b[31m" #define GREEN "\x1b[32m" #define YELLOW "\x1b[33m" #define BLUE "\x1b[34m" #define RESET "\x1b[0m"int main() {// 在控制台输…

数据分析反馈:提升决策质量的关键指南

内容概要 在当今快节奏的商业环境中&#xff0c;数据分析与反馈已成为提升决策质量的重要工具。数据分析不仅能为企业提供全面的市场洞察&#xff0c;还能帮助管理层深入了解客户需求与行为模式。掌握数据收集的有效策略和工具&#xff0c;企业能够确保获得准确且相关的信息&a…

Unity性能优化 -- 性能分析工具

Stats窗口Profiler窗口Memory Profiler其他性能分析工具&#xff08;Physica Debugger 窗口&#xff0c;Import Activity 窗口&#xff0c;Code Coverage 窗口&#xff0c;Profile Analyzer 窗口&#xff0c;IMGUI Debugger 窗口&#xff09; Stats 统级数据窗口 game窗口 可…

ELK-ELK基本概念_ElasticSearch的配置

文章目录 一、什么是ELK&#xff1f;有什么用&#xff1f;ELK是什么&#xff1f;ElasticsearchLogstashKibana ELK的作用要注意ELK的三个组件的版本需要相互兼容版本兼容性的一般原则版本兼容性对照表ELK Stack 6.x 系列ELK Stack 7.x 系列 版本升级和兼容性注意事项注意事项2 …

【网络安全 | 并发问题】Nginx重试机制与幂等性问题分析

未经许可,不得转载。 文章目录 业务背景Nginx的错误重试机制proxy_next_upstream指令配置重试500状态码非幂等请求的重试问题幂等性和非幂等性请求non_idempotent选项的使用解决方案业务背景 在现代互联网应用中,高可用性(HA)是确保系统稳定性的关键要求之一。为了应对服务…

spring—boot(整合redis)

整合redis 第一步导入数据源 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> RedisConfig&#xff08;默认有RedisTemplate&#…

关于倍速播放百度网盘视频

免责声明&#xff1a; 下述内容均为自学探索&#xff0c;仅供学习交流&#xff01;&#xff01;&#xff01; 【侵权删】 正文&#xff1a; 倍速播放百度网盘视频&#xff0c;检索到的通常有&#xff1a;1、使用夸克浏览器倍速播放&#xff1b;2、使用ipad 快捷命令。 推荐…

对HFSS中的结构使用Icepak进行热仿真-以微带电路为例-含工程

对HFSS中的结构使用Icepak进行热仿真-以微带电路为例-含工程 在HFSS中依据厂家模型自己进行连接器仿真—以SMP接口为例中分析了基于现有的结构在HFSS中对连接器进行3D建模&#xff0c;下面基于这个模型简要介绍如何在HFSS中进行热仿真。 下载链接&#xff1a;对HFSS中的结构使…

如何处理模型的过拟合和欠拟合问题

好久没有写人工智能这块的东西了&#xff0c;今天正好在家休息&#xff0c;给大家分享一下最近在训练时遇到的过拟合和欠拟合的问题&#xff0c;经过仔细的思考&#xff0c;总结如下&#xff1a; 在处理模型的过拟合和欠拟合问题时&#xff0c;我们需要根据具体情况采取不同的…

【EFK】Linux集群部署Elasticsearch最新版本8.x

【EFK】Linux集群部署Elasticsearch最新版本8.x 摘要环境准备环境信息系统初始化启动先决条件 下载&安装修改elasticsearch.yml控制台启动Linux服务启动访问验证查看集群信息查看es健康状态查看集群节点查询集群状态 生成service token验证service tokenIK分词器下载 摘要 …

省级基础设施水平数据(2000-2022年)

基础设施不仅是社会生产和居民生活的基础&#xff0c;也是国民经济各项事业发展的基石。本文将通过计算公式“基础设施水平公路里程/年末人口数”&#xff0c;结合《中国统计年鉴》和国家统计局的数据&#xff0c;对基础设施水平进行量化分析 2000年-2022年省级基础设施水平数…

关于stm32中IO映射的一些问题

在STM32固件库&#xff08;比如HAL或LL库&#xff09;中&#xff0c;GPIO的寄存器映射已经定义好了&#xff0c;开发者可以通过标准的读写操作访问GPIO引脚的状态。 一、我们可以直接通过位移操作来修改特定值。 二、下面我们提供另一种方法&#xff0c;位带操作 首先要定义一…

GPT-5 一年后发布?对此你有何期待?

GPT-5 一年后发布?对此你有何期待? 在最新技术的洪流中,GPT-5即将登场。你是否在思考,它将为我们的生活和工作带来哪些变革?接下来的探索,或许可以启发你对未来的想象。让我们一起深入这场关于未来AI语言模型的讨论。 一、技术上的提升 1.1 更强的语言理解能力 想象一…

【模块化大作战】Webpack如何搞定CommonJS与ES6混战(1-3)

在前端开发中&#xff0c;模块化是一个重要的概念&#xff0c;不同的模块化标准有不同的特点和适用场景。webpack 同时支持 CommonJS 和 ES6 Module&#xff0c;因此需要理解它们在互操作时 webpack 是如何处理的。 同模块化标准 如果导出和导入使用的是同一种模块化标准&…

SpringBoot框架:共享汽车管理的创新工具

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 共享汽车管理系统的系统管理员可以管理用户&#xff0c;可以对用户信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 投放地区管理 系统管理员可以对投放地区信息进行添加&#…

腾讯混元3D模型Hunyuan3D-1.0部署与推理优化指南

腾讯混元3D模型Hunyuan3D-1.0部署与推理优化指南 摘要&#xff1a; 本文将详细介绍如何部署腾讯混元3D模型Hunyuan3D-1.0&#xff0c;并针对不同硬件配置提供优化的推理方案。我们将探讨如何在有限的GPU内存下&#xff0c;通过调整配置来优化模型的推理性能。 1. 项目概览 腾…