热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity3D跨平台、C#、Mono、IL2Cpp.md

一、c#是什么?c#是一种语言,是微软推出的一种基于.NET框架的面向对象的高级编程语言。Windows系列的平台,后面微软标准.net标准开放出来,只需要开发出来符合.net字节

一、c#是什么?

c#是一种语言,是微软推出的一种基于.NET框架的面向对象的高级编程语言。Windows系列的平台,后面微软标准.net标准开放出来,只需要开发出来符合.net字节码的标准代码,就可以让我们的代码在.net上运行起来。

IL:Intermediate Language 中间语言,又叫托管代码(由CLR管理它的执行)

CIL:Common Intermediate Language,特指在.Net平台下的IL标准。完成基于堆栈的,运行在.net虚拟机上。

JIT:just-in-time 即时编译,将IL编译成本地CPU指令(本地代码),一个程序在它运行的时候创建并且运行了全新的代码,而并非那些最初作为这个程序的一部分保存在硬盘上的固有的代码, 就叫Jit

AOT:Ahead-of-Time,提前编译或静态编译,指的是将高级语言直接转成传统的编译型编程语言(如c/c++)。


二、Mono是什么?

Mono是Xamarin公司的一个开源项目,该项目是创建一系列符合ECMA标准的.NET工具,包括C#编译器,Mono项目可以运行在多平台(Linux,windows,Android等平台),相对于微软的.NET运行库Mono使用自己的Mono VM作为运行库。

Mono提供两种编译方式:JIT(Just-in-Time compilation,即时编译)和AOT(Ahead-of-Time,提前编译或静态编译)

C#或者VB这样遵循CLI规范的高级语言,被先被各自的编译器编译成中间语言:IL(CIL),等到需要真正执行的时候,这些IL会被加载到运行时库,也就是VM中,由VM动态的编译成汇编代码(JIT)然后在执行。


Mono缺点:



  • Mono VM在各个平台移植,在webgl很麻烦和有Bug。

  • Mono版本授权受限

  • 因为是VM(虚拟机)运行时编译后再运行,所以效率稍微受影响。


三、IL2Cpp是什么?

IL2CPP是Unity开发的跨平台CLR解决方案,把IL中间语言转换成静态CPP文件,然后由本地编译器编译成二进制机器指令。由两部分组成:AOT静态编译编译器(il2cpp.exe)和运行时库(libil2cpp)。由于C#这样高级语言有GC、线程创建等机制,运行时库(libil2cpp)是来支持这些机制。

IL2CPP和mono的最大区别就是不能在运行时动态生成代码和类型,所以这就要求必须在编译时就完全确定需要用到的类型。


类型裁剪

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

Unity提供了一个方式来告诉Unity引擎,哪些类型是不能够被剪裁掉的。具体做法就是在Unity工程的Assets目录中建立一个叫link.xml的XML文件,然后按照下面的格式指定你需要保留的类型:









IL2CPP的优点

速度更快

可以使用c++编译优化,可以缩小程序体积

可以兼容更多平台


IL2CPP的缺点

因为使用AOT,编译时耗时更多

代码里不能用基于反射的特性


四、Unity3D跨平台和IL2Cpp

Unity3D的跨平台一开始是基于Mono的跨平台来实现。

后面是使用IL2CPP来实现跨平台。



  • .net工具:将Unity开发的C#代码编译成IL字节码,采用标准的微软的.net开发。

  • IL2Cpp项目:将IL字节码编译成静态的编译型语言(c,c++)的代码,IL–>c++代码,使用AOT技术。

  • 使用各平台的编译工具(Ios xcode,Android NDK,windows vs c++)来编译c++代码,把代码编译成本地的机器指令,直接在os上执行,效率比.net的解释执行效率更高

  • IL2CPP VM:属于运行时代码,负责提供诸如GC管理,线程创建这类的服务性工作,由于去除了IL加载和动态解析的工作,所以IL2CPP VM可以做得很小,使载入时间缩短。

  • 运行的时候:unity = IL2CPP 技术编译出来的二进制指令 + IL2CPP runtime环境(GC,Thread等)


转载请声明出处:https://www.cnblogs.com/wwhhgg/



推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • imnewtotheswiftandxcodeworld,soimhavingaproblemtryingtointegrateapackagetomypro ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 这个问题困扰了我两天,卸载Dr.COM客户端(我们学校上网要装这个客户端登陆服务器,以后只能在网页里输入用户名和密码了),问题解决了。问题的现象:在实验室机台式机上安装openfire和sp ... [详细]
  • iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    从2月14日开始,上传程序的同学可能会遇到提示上传失败的提示.并且打开自己的钥匙串,发现所有的证书全部都显示此证书签发者无效.出现以下情况:Failedtolocateorgene ... [详细]
  • iOS Xcode汇编模式切换的方法介绍
    一、概念 1.汇编指令:模拟器上运行的是Intel指令,而真机上运行的是arm指令, 2.每条汇编指令的格式总是由: 操作码,操作 ... [详细]
  • linux编写弹球游戏,手把手教你开发一款基于Box2D的弹球游戏(一)
    今天我们来介绍一款物理引擎,并基于它完成一个弹球游戏。提到物理引擎,就是在游戏中模拟真实世界的运动,碰撞,摩擦等等。Coco ... [详细]
author-avatar
Irises---_372
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有