unity3d中ScriptingBackend选择mono和il2cpp的区别

unity3d中ScriptingBackend选择mono和il2cpp的区别

在iOS和Android上,在Player Settings中选择mono或il2cpp脚本后端。要更改脚本后端,请转到“Player Settings 窗口(菜单:Edit > Project Settings > Player),向下滚动到“Other Settings”部分,然后从“Scripting Backend”下拉菜单中选择mono或il2cpp。

注意:从2017.3开始,选择IL2CPP脚本后端或Mono脚本后端。然而,webgl和uwp都只支持il2cpp。iOS仍然支持快速迭代的Mono脚本后端,但您不能再向Apple提交Mono(32位)应用程序。

如果都没有被加密,用 mono 打包的 unity 游戏可以用 assembly-csharp.dll 文件反编译看到源代码。用 il2cpp 打包的 unity 游戏却只能用 il2cppdump 运行 libil2cpp.so 和 global-metadata.dat 来模拟取得 dll,但是这个 dll 只有函数名和偏移地址

MONO的好处:
1、久经考验
2、出包速度快
3、包体略小
4、支持安卓上dll动态载入程序集热更新(本人没有用过,不肯定IL2CPP完全不支持)

IL2CPP的好处:
1、没有堆内存只涨不降的问题(据说某些大厂内部有质量验收标准,这一条会有很大优势)
2、C#侧的计算密集型算法性能暴增N倍(我们项目的同地图寻路、自动建筑位置规划等算法的速度都有3倍以上提升)
3、lua热更无任何问题,反射调用还是导出式调用都很完美支持(应该不能算优点,但确实在我的预料之外)

说一下IL2CPP的问题吧:
1、构建时间长好多,安卓NDK的windows版工具链怎么就能性能这么低呢!(AMD 16核32线程撕裂者走起,NDK编译时完美支持并行化的,核多了编译慢也不是事儿了)
2、IL2CPP后,如果仅编译ARMv7的版本,部分模拟器无法启动游戏。用FAT(ARMv7 + x86)就可以了,而且模拟器上运行也非常流畅了,当然包又大了20多MB(我们的c#代码就是这么多…)

首先理解一下静态语言与动态语言的区别:

1.静态类型语言是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型.例如c++
2.动态类型语言是在运行时确定数据类型的语言。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 例如:c#

接下来说一下unity3d 中mono:

简单理解一下mono其实是一个项目框架和工具,里边包含了c#的编译器和通用语言框架。
说起来mono那不得不说c#,c#是微软推出的一种基于.NET框架的、面向对象的高级编程语言,它与java相比最大的不足是跨平台,因为在没有mono之前c#只能在window下运行.
因为有了mono这个框架所以c#才可以具有这么好的跨平台的功能,当然这是mono vm 也就是mono虚拟机是il2cpp vm之前的版本。

IL

啰嗦完了C#,.Net Framework和Mono,引出了我们很重要的一个概念”IL“。IL的全称是 Intermediate Language,很多时候还会看到CIL(Common Intermediate Language,特指在.Net平台下的IL标准)。在Unity博客和本文中,IL和CIL表示的是同一个东西:翻译过来就是中间语言。它是一种属于通用语言架构和.NET框架的低阶(lowest-level)的人类可读的编程语言。目标为.NET框架的语言被编译成CIL,然后汇编成字节码。CIL类似一个面向对象的汇编语言,并且它是完全基于堆栈的,它运行在虚拟机上(.Net Framework, Mono VM)的语言。
具体过程是:C#或者VB这样遵循CLI规范的高级语言,被先被各自的编译器编译成中间语言:IL(CIL),等到需要真正执行的时候,这些IL会被加载到运行时库,也就是VM中,由VM动态的编译成汇编代码(JIT)然后在执行。
正是由于引入了VM,才使得很多动态代码特性得以实现。通过VM我们甚至可以由代码在运行时生成新代码并执行。这个是静态编译语言所无法做到的。回到上一节我说的Boo和Unity Script,有了IL和VM的概念我们就不难发现,这两者并没有对应的VM虚拟机,Unity中VM只有一个:Mono VM,也就是说Boo和Unity Script是被各自的编译器编译成遵循CLI规范的IL,然后再由Mono VM解释执行的。这也是Unity Script和JavaScript的根本区别。JavaScript是最终在浏览器的JS解析器中运行的(例如大名鼎鼎的Google Chrome V8引擎),而Unity Script是在Mono VM中运行的。本质上说,到了IL这一层级,它是由哪门高级语言创建的也不是那么重要了,你可以用C#,VB,Boo,Unity Script甚至C++,只要有相应的编译器能够将其编译成IL都行!

IL2CPP, IL2CPP VM

本文的主角终于出来了:IL2CPP。有了上面的知识,大家很容易就理解其意义了:把IL中间语言转换成CPP文件。大家如果看明白了上面动态语言的CLI, IL以及VM,再看到IL2CPP一定心中充满了疑惑。现在的大趋势都是把语言加上动态特性,哪怕是c++这样的静态语言,也出现了适合IL的c++编译器,为啥Unity要反其道而行之,把IL再弄回静态的CPP呢?这不是吃饱了撑着嘛。根据本文最前面给出的Unity官方博客所解释的,原因有以下几个:
1.Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成
Mono的跨平台是通过Mono VM实现的,有几个平台,就要实现几个VM,像Unity这样支持多平台的引擎,Mono官方的VM肯定是不能满足需求的。所以针对不同的新平台,Unity的项目组就要把VM给移植一遍,同时解决VM里面发现的bug。这非常耗时耗力。这些能移植的平台还好说,还有比如WebGL这样基于浏览器的平台。要让WebGL支持Mono的VM几乎是不可能的。
2.Mono版本授权受限
大家有没有意识到Mono的版本已经更新到3.X了,但是在Unity中,C#的运行时版本一直停留在2.8,这也是Unity社区开发者抱怨的最多一条:很多C#的新特性无法使用。这是因为Mono 授权受限,导致Unity无法升级Mono。如果换做是IL2CPP,IL2CPP VM这套完全自己开发的组件,就解决了这个问题。
3.提高运行效率
根据官方的实验数据,换成IL2CPP以后,程序的运行效率有了1.5-2.0倍的提升。

使用Mono的时候,脚本的编译运行如下图所示:
在这里插入图片描述

简单的来说,3大脚本被编译成IL,在游戏运行的时候,IL和项目里其他第三方兼容的DLL一起,放入Mono VM虚拟机,由虚拟机解析成机器码,并且执行
IL2CPP做的改变由下图红色部分标明:
在这里插入图片描述

在得到中间语言IL后,使用IL2CPP将他们重新变回C++代码,然后再由各个平台的C++编译器直接编译成能执行的原生汇编代码。

总结一下:
1.将il变成cpp的首要原因除了是cpp在各大平台的可移植性高之外还有cpp在各个平台编译时会做相应的代码优化,提高运行效率
2.为什么由il编译成cpp后还需要il2cpp vm的存在呢,是因为动态语言里转换成静态语言时仍然有内存回收问题的存在,需要靠动态语言的gc去解决,还有线程的创建工作,所以il2cpp vm只包含了一小部分工作,相比mono vm剔除了不必要的IL加载和动态解析的工作,使得IL2CPP VM可以做的很小,并且使得游戏载入时间缩短。

3.其实是ios不支持动态语言的编译,所以只能使用AOT(Ahead Of Time)编译而非JIT(Just In Time)编译

yolo算法港口码头船舶目标检测数据集 目标类别:['ship'] 中文类别:['船舶'] 训练集:16046 张 验证集:1971 张 测试集:983 张 总计:19000 张 该数据集提供了data.yaml文件,内容如下: train: ../train/images val: ../valid/images test: ../test/images nc: 1 names: ['ship'] 该数据集聚焦于港口码头及近海水域的船舶检测任务,涵盖多种类型船舶在不同天气、光照水文条件下的真实场景。图像样本覆盖了货轮、客轮、拖船、油轮及工程船等典型船只,充分体现了海上交通与港口作业的复杂性与多样性。通过高精度标注,该数据集为海上智能监控、船舶识别与航行安全预警系统提供了高质量的数据支撑,具有重要的实际应用价值。 该数据集在训练集、验证集测试集之间实现了科学合理的分布,训练集包含16046张图像,验证集1971张,测试集983张,总计19000张。这种分布结构确保了模型在训练过程中具备充足的样本学习能力,同时验证集与测试集规模适中,能够有效评估模型的泛化性能与稳定性,符合深度学习项目对数据划分的标准要求。 该数据集的标注工作严谨规范,所有船舶均采用精确边界框进行标注,覆盖了不同尺寸、姿态视角下的目标实例。标注框紧密贴合船舶轮廓,未出现明显偏移或遗漏,且在复杂背景(如水面反光、雾天、桥梁遮挡)下仍保持高一致性。标注信息完整可靠,为后续模型训练提供了坚实基础。 该数据集可广泛应用于港口自动化管理、海上交通监控、船舶动态跟踪、航道安全预警以及海洋执法等领域。其丰富的场景覆盖多样化的船舶类型使其特别适用于智慧港口建设、海上搜救系统开发及航运物流智能化升级,能够有效提升相关系统的识别准确率与响应效率,推动海洋经济数字化转型。
内容概要:本文围绕弱电网环境下虚拟同步发电机(VSG)的正负序阻抗建模与稳定性分析展开,基于序阻抗建模方法,利用Simulink搭建VSG的正负序阻抗模型,深入研究其在弱电网条件下的阻抗特性及并网系统的交互稳定性。重点探讨了正负序阻抗的解耦特性及其对系统宽频振荡的影响机制,并采用扫频法进行小信号建模与模型有效性验证,为构网型变流器在复杂电网环境中的稳定性分析提供了理论依据与仿真技术支持。该研究对于新能源高比例接入背景下的并网系统稳定运行具有重要意义。; 适合人群:电力电子、新能源并网、电力系统自动化、电气工程等相关专业的研究生、高校科研人员及从事新能源并网技术研发的工程技术人员。; 使用场景及目标:①掌握基于Simulink的虚拟同步发电机正负序阻抗建模方法;②理解弱电网条件下VSG并网系统的稳定性影响因素与振荡机理;③学习并应用扫频法进行小信号稳定性分析与阻抗特性辨识;④为宽频振荡分析、构网型控制策略设计、新能源并网稳定性评估等科研与工程问题提供可复现的技术路径与仿真基础。; 阅读建议:建议读者结合Matlab/Simulink环境动手复现文中模型,重点关注正负序激励信号的注入方式、阻抗扫描流程及Bode图/Nyquist图的稳定性判据解读,同时可延伸阅读相关博士论文与高水平期刊文献,深化对序阻抗建模理论与实际工程应用的理解。
内容概要:本文围绕虚拟同步发电机(VSG)接入弱电网的序阻抗建模与稳定性分析展开,通过Simulink仿真实现VSG系统的正负序阻抗特性建模,并采用扫频法验证模型的准确性。深入探讨了在弱电网背景下,VSG并网系统因电网与变流器之间阻抗交互引发的稳定性问题,系统阐述了正负序阻抗解耦建模的理论基础与实现方法,及其在小信号稳定性评估中的关键作用。资源包配套提供了完整的MATLAB代码与Simulink仿真模型,涵盖了阻抗建模、小信号分析、扫频辨识等核心技术环节,有助于科研人员深入理解构网型变流器的动态响应机制与稳定机理,为相关高水平学术研究与工程实践提供有力支撑。; 适合人群:具备电力电子、电力系统分析等相关基础知识,从事新能源并网技术、微电网控制、虚拟同步机(VSG)或构网型变流器研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握虚拟同步发电机在弱电网条件下的序阻抗建模理论与具体实现方法;②学习并实践基于Simulink的小信号分析与扫频辨识技术,掌握奈奎斯特判据等稳定性分析手段;③能够复现、验证VSG系统的序阻抗特性曲线,分析其稳定边界,服务于学术论文撰写、科研项目攻关及创新性控制策略的设计与验证。; 阅读建议:此资源以仿真复现为核心目标,建议读者务必结合所提供的完整代码与仿真模型进行动手实践,重点关注扫频激励信号的施加方式、频率响应数据的提取流程以及阻抗曲线的物理内涵解读,同时应查阅相关经典文献,以深化对构网型控制原理与电力系统稳定性理论的系统性理解。
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,网络通信扮演着至关重要的角色,而Socket编程则是达成此目的的关键技术。本文将详细研究利用C#语言进行Socket编程的方法,尤其关注在处理异步通信应对TCP粘包问题的第三阶段。C#拥有完备的类库资源,为网络编程提供了便利,使得开发者能够便捷地开发基于TCP/IP的客户端服务器程序。 让我们首先明确Socket的概念。Socket是一种进程间通信(IPC)的工具,它使网络上的应用程序能够进行双向交流。在C#语言中,System.Net.Sockets命名空间中包含了Socket类,该类是执行TCP/IP通信的基础。 异步通信在现代网络应用中具有核心地位,因为它能显著提升程序的响应能力工作效率。C#的Socket类包含了BeginConnect、BeginSend、BeginReceive等异步操作方法,这些方法使得网络操作可以在不干扰主线程的情况下进行。异步通信借助事件驱动机制运作,当数据准备就绪时,系统会启动相应的事件,随后回调函数会被执行以处理数据。 在TCP协议的框架下,由于其流式传输的特点,多个小的数据单元可能会被组合成一个大单元发送(粘包现象),或者一个大单元可能会被分割成多个小单元发送(拆包现象)。这种现象在数据解析过程中可能引发困难。处理TCP粘包问题主要有两种途径:设定合适的消息界限或者采用固定长度的消息格式。 1. 设定消息界限:在每个数据单元的末尾附加特定的分隔符,比如空字符或特殊字符串,这样在接收端可以通过分隔符来区分每个独立的数据单元。 2. 固定长度消息:每个数据单元都设定固定的长度,接收端依据预设的长度来拆分数据。 在C#...
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值