如何评价C#热更框架huatuo?

程序员 2024-10-2 05:16:29 29 0 来自 中国
为什么这么NB?huatuo革命Unity热更新
近来huatuo(华佗)热更新办理方案火爆了unity开辟圈,早先我以为热更新嘛,不就是内置一个脚本表明器+脚本语言开辟,如xLua, ILRuntime, puerts。Huatuo又能玩出什么格式,凭什么会这么NB,引起了那么多步调员的关注与歌颂呢?带着这些标题我详细的看了huatuo的资料,阅读了示例项目+huatuo源码,我也瞬间成了一位”佗粉”。接下来更新一系列的笔墨教程+视频教程来详细的讲授huatuo热更新。
对惹,这里有一个游戏开辟交换小组,希望各人可以点击进来一起交换一下开辟经验呀
要把握huatuo热更新,我们先搞懂一些底层的概念与原理,搞懂这些是把握huatuo的关键。本节我将从以下3个方面来详细的讲授huatuo热更新办理方案:
il2cpp是什么? AOT是什么?
huatuo热更新的技能原理;
huatuo热更方案的革命性上风;
il2cpp是什么? AOT是什么?
在说il2cpp之前,先说说mono, 在mono之前,C#固然很好,但是只在windows眷属平台上使用,就这点C#与Java就无法比。于是微软公司向ECMA申请将C#作为一种尺度。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO尺度(ISO/IEC 23270)。意味着只要你服从CLI(Common Language Infrastructure),第三方可以将任何一种语言实现到.Net平台之上。有了CLI的尺度,Mono就诞生了, 该项目的目的是创建一系列符合ECMA尺度(Ecma-334和Ecma-335)的.NET工具,包罗C#编译器和通用语言架构。与微软的.NET Framework(共通语言运行平台)差别,Mono项目不光可以运行于Windows体系上,还可以运行于Linux,FreeBSD,Unix,OS X和Solaris,乃至一些游戏平台,比方:Playstation 3,Wii或XBox 360之上。Mono使得C#这门语言相对于微软的.Net有了很好的跨平台本领。
.Net Framework运行时库Mono使用自己的Mono VM。 加上C#自己快速友好的开辟本领,终极使得Unity团队在创建之初就决定将Mono,C#作为其核心。
接下来引出紧张的一个概念”IL“。IL的全称是 Intermediate Language,很多时间还会看到CIL(Common Intermediate Language,特指在.Net平台下的IL尺度)。在Unity中,IL和CIL体现的是同一个东西:它是一种属于通用语言架构和.NET框架的低阶(lowest-level)的编程语言。将.NET框架的语言编译成CIL,然后汇编成字节码。CIL类似一个面向对象的汇编语言,而且它是完全基于堆栈的,它运行在.net假造机上。
CLI尺度出来后,又出现一个项目:IL2CPP,把IL转成静态的c++代码文件,由本地编译器编译成二进制呆板指令。由于C#如许的高级语言都有垃圾接纳等机制,以是IL转成静态的c++代码后,另有一个IL2CPP的runtime(IL2CPP VM)用来支持这些高级语言特性。通过IL2CPP技能,我们IL代码转成本地呆板码,得到很好的性能。Unity也接纳了这个技能,用unity开辟的C#代码可以通过.net 转成IL代码,再通过IL2CPP转成静态c++文件,然后编译成本地呆板码运行。为什么Unity接纳IL2CPP呢?重要缘故原由有:
a:Mono VM在各个平台移植,维护非常耗时,偶尔乃至不大概完成。
b: Mono版本授权受限, 换IL2CPP,IL2CPP VM这套完全自己开辟的组件,就办理了授权标题。
c: 进步运行服从,换成IL2CPP以后,步调编译成了硬件目的呆板指令,运行服从提升1.5-2.0倍。
Unity基于IL2CPP 的架构原理,如图1.1-1所示:
图1.1-1
Unity IL2CPP 运行表示图
末了一个概念AOT(Ahead of time),AOT技能指的是将高级开辟语言直接转成传统的编译型编程语言(如C/C++),再编译成呆板指令代码在硬件上运行。IL2CPP可以成为AOT技能。
huatuo热更新的技能原理
铺垫完IL2CPP,AOT等概念后,接下来就来说huatuo了。由图1.1-1可知Unity终极打包运运动:AOT(本地呆板指令实行)+, IL2CPP VM(提供根本服务支持,如gc)。对于IL2CPP 底层运行模式而言,运行的时间是数据内存对象+代码呆板指令两个部门。huatuo做热更就是扩展了IL2CPP VM的服务,让它在使用原来数据内存对象的环境下,扩展了表明实行IL代码的功能(注意这里的使用”原来数据内存对象”很紧张)。让IL2CPP的运行模式变为: 数据内存对象+AOT代码呆板指令+Interpreter IL指令表明实行的3个部门。huatuo做热更的时间,我们只必要使用Unity ADF(asmdef, 步调集定义文件)的机制,让Unity对某一部门单独编译出一个IL指令的.dll。热更时,IL2CPP_huatuo就可以装载IL指令.dll, 由IL2CPP_huatuo来表明实行。如许AOT模式+huatuo IL指令表明实行 (Interpreter)让huatuo能具备热更新的功能。同时huatuo表明实行使用的是原来AOT的数据内存对象,以是huatuo热更新不会有别的热更新方案必要的接口导出,跨域调用等一系列标题。让开辟者在不消做任何特殊处理处罚的环境下,直接使用寻常的unity开辟技能能做到热更新。由于可以直接使用AOT的数据内存对象,内存占用,性能都会更好。有了这些上风(不消做任何代码上的处理处罚就能实现热更),难怪Unity开辟者都欢呼雀跃,因为他们终于能丢掉xLua, ILRuntime又笨又重的壳,直接从底层办理标题。以是我以为将来的huatuo会成为Unity热更的主流方案。
huatuo热更的革命性上风
分析完原理后,我们来看下huatuo的革命性上风:
huatuo第1个上风是基于AOT(本地呆板代码实行)+Interpreter (IL表明实行)使用同一个内存数据对象,没有跨域访问的标题。我们来拿xLua或ILRuntime热更方案来举例,这些方案都有一条原则,尽量淘汰与Unity C#层的交互,但是这种交互又制止不了而且量大,比如我们要在逻辑热更代码内里访问 Unity C#的GameObject对象数据,终极在运行的时间,GameObject 会在AOT模式下的原生内存数据结构对象。由于xLua或ILRuntime有自己的假造机,以是不能直接访问原生GameObject数据对象,往往要把访问内里的数据包装成函数,如许性能开销就大大的增长了。而huatuo是在IL2CPP模式下的表明实行,直接可以访问原生的数据对象。
huatuo第2个上风是我们的逻辑代码更新后(1.0版本到2.0版本),假如你发布新版本2.0(重新安装新版本的app),可以直接把更新的逻辑,直接使用AOT编译出来,不消表明实行,从而得到AOT的性能。而基于xLua, ILRuntime的热更方案开辟的代码(1.0版本到2.0版本),用户纵然重新安装2.0客户端后,还是表明实行,新版本的性能无法到达AOT的性能级别。
huatuo 第3个长处是相比传统的Lua或ILRuntime热更,他能更新恣意部门的代码。不消像Lua或ILRuntime一样,分热更代码+框架代码,框架代码有bug还不能热更。
有了这些革命性的上风,你没有来由不关注+使用huatuo。
本日的分享就到这里了, 关注我们, 接下来会继承有huatuo热更的系列教程。
下节预报: huatuo办理方案源码结构与项目实战
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:44, Processed in 0.174328 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表