唐老师笔记-Unity跨平台原理

观看前需知  https://blog.csdn.net/2501_91477053/article/details/148573392?sharetype=blog&shareId=148573392&sharerefer=APP&sharesource=2501_91477053&sharefrom=link

本篇内容 Unity跨平台原理

目录

  1. 为什么要进行c#补充
  2. Unity包含的两个部分
  3. .Net是什么
  4. CLS公共语言规范是什么
  5. CTS公共类型系统是什么
  6. CLI公共语言基础结构是什么
  7. 如何实现跨语言
  8. 跨平台实现
  9. .Net Framework是什么
  10. 制作应用程序
  11. CIL代码(通用中间代码)
  12. Mono是什么
  13. Mono如何实现跨平台
  14. .Net Core是什么
  15. Unity和Mono的关系
  16. IL2CPP是什么
  17. Mono和IL2CPP区别
  18. IL2CPP打包时的类型裁剪问题

 

 

 

1.为什么要进行C#知识补充

1.了解Unity跨平台的基本原理

2.了解不同Unity版本使用的C#版本

3.学习这些C#版本中的知识点

 

2.Unity主要包括的两个部分

Unity Engine(引擎)

提供UnityEngine.dlI动态库 各平台不同,C/C++编写 包含平台相关代码,图形API 物理引擎 灯光等所有游戏引擎底层内容

Unity Editor (编辑器)

提供UnityEditor.dII动态库,大部分由C#编写,用户脚本最初可使用C#,JavaScript,Boo语言编写,项目代码最后由Mono编译

 

3..Net是什么

微软的.Net既不是编程语言也不是框架,是一整套技术体系的统称,或说它是微软提供的技术平台的代号,简单理解就是微软为自己一系列产品取的代号

包含:

框架体系.Net Framework,.Net Core,Mono等
开发语言C#,VB,F#等
开发工具Visual Studio,Visual Studio Code等
C#是.Net平台主推的开发语言

微软做.Net平台的目的

1.跨语言

只要是面向.NET平台的编程语言中的一种语言编写的内容都可无缝地用在另种语言编写的应用程序中

2.跨平台

一次编译无需任何代码修改,应用程序就可运行在任意有.NET框架实现的操作系统上运行,即代码不依赖于操作系统,也不依赖硬件环境

 

4.CLS公共语言规范是什么

.Net专门参考每种语言并找出了语言间的共性,定义了一组规则 一组语言互操作的标准规范

 

5.CTS公共类型系统是什么

当需要设计面向.Net的语言时需要遵循的体系,CLS是CTS的子级

 

6.CLI公共语言基础结构是什么

是微软将CTS等内容提交给国际组织计算机制造联合会ECMA的一个工业标准

 

7.如何实现跨语言

只要开发者都遵守CLS来编码,那么代码就能被任意.Net平台支持的语言所通用,即可通过不同的编程语言来创建应用程序

如果一门编程语言支持CTS,就称是面向.NET平台的语言

 

8.跨平台实现

早期.Net系列产品主提供给Windows操作系统服务,即使跨语言了也无跨平台特性

 

9..Net Framework是什么

它是一个可快速开发,部署网站服务及应用程序的开发框架,是Windows中的一个组件,部分开源,主用于开发Windows下应用程序,主用于开发Windows平台下应用,包含Windows平台的所有特性

包含

1.CLR公共语言运行时

2.虚拟执行系统

3..NET Framework类库等


2002年出现 部分开源

 

10.制作应用程序

编程语言+调用各种类库进行开发生成程序集;只要支持CLS公共语言规范的语言都可用于开发Windows下的各种应用程序和网站程序

BCL(基础类库),FCL(框架类库)是这个框架体系中为我们实现好的各种API

程序集的表现就是后缀为.dll或.exe格式的文件,其中包含的最关键信息:PE头,CLR头,(程序的格式信息,如入口方法,版本号等)

 

11.CIL代码(通用中间代码)

将不同代码翻译为统一规范的中间代码,是介于源代码和机器码之间的代码,之后会通过CLR产生机器码

让应用程序在操作系统上运行CLR,CLR是.Net Framework的基础,,所有的.Net技术都是建立在此之上的,它是一个在执行时管理代码的代码,提供内存管理,线程管理等核心服务,就像一个小型的操作系统
可形象称“.Net虚拟机”

想应用程序在目标操作系统上能够运行必须依靠.Net提供的CLR环境来支持,就必须在操作系统上安装.Net Framework,它会把程序集中的IL中间代码翻译成机器码最终在操作系统上运行

 

12.Mono是什么

它是一个由Xamarin公司所赞助的开源项目,已被微软收购,早期乃至现在也是.Net的跨平台解决方案 .Net Core出现前.Net平台实现跨平台的不二之选

它基于.Net的CLI提供了微软.Net FrameWork的另一种实现,相对.Net FrameWork最大区别是具备跨平台能力,不仅可运行在Windows,MacOS,Linux等操作系统,还可运行在PS3,XBOX,Wi等主机平台上

主构成部分:

1.C#编译器
2.Mono Runtime 类似CLR
3.BCL基础类库
4.Mono类库

Mono Runtime含:

1.JIT即时编译器

2.AOT提前编译器,GC,类库加载器等

Mono类库提供很多超出.Net的些额外功能,主用于构建各种操作系统上的应用


2004年出现 完全开源

 

13.Mono如何实现跨平台

Mono利用.Net平台制定的CLI编译成CIL,再用CLR转换为操作系统的原生代码

主做的是在各种操作系统上实现了对应的CLR内容,不同语言编写的逻辑就能在指定操作系统上运行了,这套规则是.Net Framework规则上的修改和添加

 

14..Net Core是什么

它是.Net Framework的新一代版本,像他的兄弟,是它的翻版实现

基于.Net Framework来进行设计的主目的就是跨平台,是.Net技术框架组成在Windows,MacOS,类Linux系统下的具体实现

原理是为不同操作系统实现对应的CLR,就可在不同的平台上翻译IL成机器码


2016年出现,完全开源

 

15.Unity和Mono的关系

从.Net FrameWork到.Net Core,中间.Net平台有14年的并不跨平台的空窗期,.Net还是支持跨平台的,靠Mono

Mono出现于2004,而Unity公司于2004年成立,Unity的底层是通过C/C++来完成的,虽然C++本身跨平台,但使用C++作为上层逻辑开发语言,那开发者选择性相对较少,且初学者学习难度也较大

因Mono同时具备跨平台和跨语言的两个特性,为了更方便让开发者使用 Mono成为了不二之选

 

16.IL2CPP是什么

它是在Unity4.6.1后的版本中加入的脚本后处理方式,可理解为继Mono之后的一种跨平台解决方案

通过它可把IL中间代码转译为CPP代码C++,再利用各平台优化过的编译器编译为对应平台的目标代码,因IL2CPP运行效率有很大优势,建议使用

 

17.Mono和IL2CPP区别

Mono

>C#代码

>Mono C#编译器

>IL中间代码

>Mono VM

>操作系统的原生代码

  • 构建(最终打包时)速度快
  • Mono编译机制是JIT即时编译,所以支持更多类库
  • 必须将代码发布为托管程序集.dll文件
  • Mono VM虚拟机平台维护麻烦,且部分平台不支持(WebGL)
  • 因Mono版本授权原因,C#很多新特性无法使用
  • IOS支持Mono,但不在允许32位的Mono应用提交到应用商店

IL2CPP

>C#代码

>Mono C#编译器

>IL中间代码

>IL2CPP

>C++

>C++编译器

>原生汇编代码

>IL2CPP VM

  • 相对Mono构建(最终打包时)速度慢
  • 只支持AOT提前编译
  • 可启用引擎代码剥离来减少代码的大小
  • 程序的运行效率比Mono高,运行速度快
  • 多平台移植更加方便 跨平台也更好维护

IL2CPP和Mono的区别就在于当生成了IL后Mono是直接通过虚拟机转译运行,而IL2CPP会将IL转译为C++代码,再通过各平台的C++编译器直接编译为可执行的原生汇编代码,虽然中间代码变为了C++,但内存管理还是遵循C#中GC的方式,这也是为什么有一个IL2CPP VM虚拟机存在的原因,它主用完成GC管理,线程创建等服务工作的

最大区别是编译模式不同造成的问题,IL2CPP不能在运行时动态生成代码和类型,所以必须在编译时就完全确定需要用到的类型

如List必须在代码中显示的调用过,才能保留List类型,如果在热更新时调用List,但它在代码中无显示调用过就会有报错等问题

 

18.IL2CPP打包时的类型裁剪问题

用他打包时会将代码中没有引用到的类型裁剪掉,以达到减小发布后包的尺寸的目的

实际使用中很多类型易被意外剪裁掉,造成运行时抛出找不到某类型的异常,特别是通过反射等方式在编译时无法得知的函数调用,在运行时都很有可能遇到问题

解决方案:

  • 将IL2CPP代码剥离设置为低
  • 或通过unity提供的link.xml白名单方式,在Unity工程的Assets目录中或子目录创建该Xml文件,来告诉Unity哪些类型是不能够被剪裁掉的

泛型类型被裁剪解决方案

  • 泛型类:声明一个类,当中声明一些公共泛型类变量
  • 泛型方法:随便写个静态方法中调用泛型方法,这个静态方法无需被调用,即可在预先编译前让IL2CPP知道该内容需使用

 

你可能感兴趣的:(笔记,unity)