首页 > 其他分享 >为什么这么NB?huatuo革命Unity热更新

为什么这么NB?huatuo革命Unity热更新

时间:2023-11-01 10:11:46浏览次数:33  
标签:C# NB IL2CPP Unity AOT huatuo 代码

最近huatuo(华佗)热更新解决方案火爆了unity开发圈,起初我觉得热更新嘛,不就是内置一个脚本解释器+脚本语言开发,如xLua, ILRuntime, puerts。Huatuo又能玩出什么花样,凭什么会这么NB,引起了那么多程序员的关注与称赞呢?带着这些问题我详细的看了huatuo的资料,阅读了示例项目+huatuo源码,我也瞬间成了一位”佗粉”。接下来更新一系列的文字教程+视频教程来详细的讲解huatuo热更新。

 

要掌握huatuo热更新,我们先搞懂一些底层的概念与原理,搞懂这些是掌握huatuo的关键。本节我将从以下3个方面来详细的讲解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#作为其核心。

 

 

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。

标签:C#,NB,IL2CPP,Unity,AOT,huatuo,代码
From: https://www.cnblogs.com/bycw/p/17802403.html

相关文章

  • [17章+电子书]C#速成指南-从入门到进阶,实战WPF与Unity3D开发
    点击下载:[17章+电子书]C#速成指南-从入门到进阶,实战WPF与Unity3D开发  提取码:a3s5 《C#速成指南--从入门到进阶,实战WPF与Unity3D开发》完整讲解了C#语言的核心知识和高阶编程技巧,并结合WPF客户管理系统和Unity3D切水果游戏两大实战项目,帮你实现技术的精通,完成从Zero到Hero的蜕变......
  • pod报错 pod has unbound PersistentVolumeClaims.
    1.背景部署Grafana的时候pod报错podhasunboundPersistentVolumeClaims.2.原因分析情况1.查看了grafana-data-pvc.yaml文件,发现storageClassName取数为空,当storageClassName为空的时候如果没有指定DefaultStorageClass,那么是不会分配pv给grafana-data的。情况2.查看......
  • Unity显示 物体的最小uv
    开发过程中遇到同一个mesh,同一个shader,但是出现渲染结果不一致的情况。初步猜测是光栅化后,像素中心对应物体的位置不同,uv通过插值生成,从而导致渲染结果不一致。下文验证了uv会随着物体的位置不同,而发生改变。验证使用了https://github.com/cinight/MinimalCompute项目中的......
  • Unity 创建自定义渲染管线
    可以看官方的https://docs.unity3d.com/Manual/srp-custom-getting-started.html或者这位大佬的https://zhuanlan.zhihu.com/p/378828898......
  • ScreenBar Halo:程序员的视觉守护者
    前言:在最近的一段时间内,我每天都沉浸在代码的世界中,然而,这样的密集工作导致我的眼睛开始感到不适。经过深思熟虑,我决定去医院进行一次全面的检查。医生严肃地告诉我,我需要适当休息,并减少长时间盯着电脑屏幕的行为。作为一位IT程序员,我要挣钱生活!必须每天进行的代码编写工作,我该如何......
  • 数据结构与算法-cnblog
    数据结构与算法课程笔记树与二叉树树的深度与高度高度就可以理解为深度看层数:如果根结点第0,层数=深度=高度-1如果根结点第1,层数=深度=高度深度定义是从上往下的,高度定义是从下往上的......
  • Unity显示一个对象的像素个数
    下图显示了该面片占用的像素个数为147456。因为面片的大小为1,坐标为(0,0.5f,0)。相机为正交视角,OrthoSize为1.面片完全显示且高度为(768/2)^2=384^2=147456。另外,可以推测,pixelshader渲染会在所有对象的vertexshader计算结束后开始。即使面片被遮挡,但如果没做处理依然......
  • Unity学习笔记--入门
    Unity引擎学习入门:Unity中的坐标系:左手坐标系(z轴正方向向里面)x轴:平行屏幕向右正方向y轴:平行屏幕向上正方向Z轴:垂直屏幕向内为正方向【补】openGL是右手坐标系DirectX是左手坐标系窗口:窗口布局Layout:Scene这里我们可以看见所有的场景内容。窗口上的工具栏:有关......
  • Unity进阶开发-FSM有限状态机
    #Unity进阶开发-FSM有限状态机前言我们在进行开发时,到了一定程度上,会遇到数十种状态,继续使用Unity的Animator控制器会出现大量的bool,float类型的变量,而这些错综复杂的变量与Animatator控制器如同迷宫版连线相结合会变得极其的复杂且无法良好维护扩展,出现一个BUG会导致开发过程......
  • Unity进阶提升-2D游戏跳跃手感优化(跳起下落)
    在进行2D游戏开发时,跳跃是不可缺少的一个重要功能。但是我们在Unity开发时Unity本身的物理引擎并不能提供很好的的手感,下落的时候轻飘飘的,这操作起来显然非常不舒服。所以,我们需要自己对跳跃进行优化,以此来获得更好的手感。我们不难发现,在绝大多数2D游戏的跳跃中,下落的速度比上升......