当前位置: 首页 > news >正文

【dotnet】Unity 两种打包方式解析(IL2CPP Mono)

背景

Unity的脚本资源是以dll文件的方式存在于磁盘上,在Unity中进行打包时,有两种打包方式选择:MonoIL2CPP
在这里插入图片描述

Mono 介绍

Mono打包后文件中存在大量动态链接库文件(.dll后缀文件),也包括mono虚拟机文件(libmonobdwgc-2.0.so和libMonoPosixHelper.so),在运行程序时dll文件会加载到mono虚拟机中

Mono脚本编译流程

在Unity编译打包时,使用C#书写的脚本会经过Mono的C#编译器打包为中间语言IL(Intermediate Language,IL语言所在的文件就是.dll后缀的文件),然后和其他dll文件一起在Mono虚拟机(Mono VM,Mono Virtual Machine)中运行。中间语言IL的存在主要是为了平台的兼容性,因为不同指令集平台执行同样的程序的具体机器语言并不是相同的,如果打包时直接将程序翻译为机器语言,那么打包后的程序包就只能在指定平台上运行,所以我们在打包时先将程序编译为中间语言IL,在不同的平台上使用Mono虚拟机(不同平台有自己的虚拟机,这个mono就很牛逼,做了很多平台的vm)将IL相应地翻译为该平台的机器语言执行。

但是Unity这样支持多平台的引擎,Mono官方的VM肯定是不能满足需求的,这个后面就引出了IL2CPP,后话了。
在这里插入图片描述

IL2CPP 介绍

IL2CPP 是 Unity 自 4.6.1p5版本 新的 scripting backend 方式,为Unity提供了更加高效、更加便携的虚拟机。IL2CPP打包后没有了dll文件,Unity主工程的dll文件(Assembly-CSharp.dll)和Mono虚拟机文件集成为IL2CPP虚拟机文件(libil2cpp.so)。

IL2CPP主要由两部分组成:

1.AOT静态编译编译器(il2cpp.exe),将IL转换为C++源码,再交给各平台的C++编译器进行编译,达到平台兼容的目的

2.运行时库(libil2cpp),运行时库则会提供诸如垃圾回收、线程/文件获取、内部调用直接修改托管数据结构的原生代的服务与抽象

在这里插入图片描述

IL2CPP 脚本编译流程

在Unity编译打包时,IL2CPP模式同样先将工程中的文件编译为IL,但是IL2CPP不会直接在虚拟机中运行这些IL,而是将工程IL和其他IL一起使用IL2CPP将这些IL变回CPP(C Plus Plus或C++)代码,然后再将C++代码放到本地编译器(具体运行的机器平台的编译器)上编译为能执行的原生汇编代码,再使用自研IL2CPP VM运行。

总结

unity mono和il2cpp真的完全两种路子,mono是基于开源的mono,我将c# 语言转为IL,然后其在各个平台都实现了CLR(用于运行IL),可以运行IL,就这么简单粗暴,类似Java
另外一种是il2cpp自研方式,我还是利用mono将c# 转为IL,然后就不一样了,我将IL转成cpp代码,如将dll转为cpp代码。。。然后利用各个平台编译cpp代码的轮子编译cpp代码,再造一个vm可以进行垃圾回收等等操作,我不在.net平台上玩了

相关文章:

  • 空间数据结构管理---RTree(上篇)
  • leetcode每天5题-Day37
  • Elasticsearch入门开发
  • ETL性能优化
  • 猿创征文|【第11题】求坐上公交的最晚时间(考察贪心算法)
  • 直流有刷电机驱动基于STM32F302R8+X-NUCLEO-IHM07M1(一)
  • Pandas loc与iloc
  • 基于QT的指挥猫猫打架玩耍的小游戏设计
  • K8s的Service详解
  • MyBatis-plus组件学习
  • pgsql执行脚本并传参
  • Vue组件通信(组件的自定义事件、全局事件总线、消息订阅与发布、插槽、props)(八)
  • 【编程题】【Scratch三级】2020.12 躲避恐龙
  • nodejs+vue+elementui在线公益-帮助流浪动物网站python java
  • linux C/C++ socket编程
  • Elasticsearch 参考指南(升级前重新索引)
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • JS+CSS实现数字滚动
  • Rancher-k8s加速安装文档
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring核心 Bean的高级装配
  • Vue.js源码(2):初探List Rendering
  • 从伪并行的 Python 多线程说起
  • 多线程 start 和 run 方法到底有什么区别?
  • 讲清楚之javascript作用域
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 普通函数和构造函数的区别
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 微信小程序实战练习(仿五洲到家微信版)
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 一些关于Rust在2019年的思考
  • 正则与JS中的正则
  • #、%和$符号在OGNL表达式中经常出现
  • #mysql 8.0 踩坑日记
  • #在 README.md 中生成项目目录结构
  • (2022 CVPR) Unbiased Teacher v2
  • (C++17) std算法之执行策略 execution
  • (ibm)Java 语言的 XPath API
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (论文阅读11/100)Fast R-CNN
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .equals()到底是什么意思?
  • .form文件_一篇文章学会文件上传
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core控制台应用程序初识
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • /boot 内存空间不够
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面