一句话说说huatuo和Hybridclr:
huatuo是途游开源的,之前hybird的作者在途游,后来开源华佗,后来被途游收回,就写了hybirdCLR;
一、Unity - IL2CPP技术原理与AOT
阶段1:C#发展,---> windows系列平台 ----> 微软标准 .net的标准开发出来;
只需要开发出来符合.net字节码的标准代码,就可以让代码在.net上运行起来。
阶段2:项目 --- > Mono项目,.net虚拟机(Linux、windows、Androud等平台)+.net开发环境;
C# ---> Mono ---> .net字节码 ----> .net虚拟机上运行起来。
阶段3:早期Unity ---> Mono方案 ----> 实现跨平台
阶段4:Unity --->使用Mono的问题?
a;程序的执行效率,.net字节码 ----> 运行的;
b:Mono虚拟机的移植 ---> webgl ---> bug,mono ----> Unity ---->;Unity 跨平台会收到限制;
c:版权问题,Unity Mono. .net授权
找出了另一条技术路线:IL2CPP项目
IL是什么?Intermediate Language 是一种通用的语言架构和.net框架的低阶(lowest-level)的编程语言
CLI是什么?Common Language Infrastructrue 特指在.net平台下的IL标准,CIL类似一个面向对象的汇编语言,并且它是完全基于堆栈的,它运行在.net虚拟机上。
所以IL与CLI在Unity开发中 ---> 同一件事情.net平台下的字节码程序。 ----> IL标准是开发的(没有版权问题)
.net工具:Unity开发的C#代码 ---> IL字节码;(可以使用标准的.net开发)
IL2CPP项目: IL字节码 ---> 静态编译型语言(C语言,C++)的代码;简言就是IL --转--> C++代码
后来就可以使用xcode、android NDK windows visual studio c++ 来编译我们的代码,把我们的代码编程本地的机器指令,直接在OS上执行---> 效率 高于 .net的解释执行。
AOT是什么?Ahead of time 离线编译,把高级语言 ----> 静态语言 -----> 直接编译成二进制机器指令;
IL2CPP 这个项目而言 :采用的AOT技术
JIT技术:Just In Time 运行时编译成二进制机器指令
IL2CPP vm:IL2CPP的虚拟机,更像一个库,提供一些服务;(gc垃圾回收、IL2CPP编写一些库来提供服务)
运行时的时候:Unity == IL2CPP技术编译出来的二进制指令 + IL2CPP runtime的环境(GC,Thread等技术支撑)
Interpreter:解释执行
过程图:
二、huatuo热更新原理
huatuo热更新是基于IL2CPP VM这个环节来的,和其他热更技术不同;
Lua方案:Lua内置Lua虚拟机 + Lua代码 (是在Native excutable asm 环节)
ILRuntime方案:内置C#虚拟机 + 解释执行ILRuntime (是在Native excutable asm 环节)
内置虚拟机:会有自己解释执行的一个运行环境,无法直接继承MonoBehaviour(IL2CPP 级别的数据对象),需要封装一层;
会有跨域访问、接口导出等问题 ---> 需要开发者自己来处理;::: 麻烦点,不符合标准的Unity开发,需要另外做一套另个标准的开发。
2.1 huatuo到底做了什么呢?
IL2CPP runtime 环境(IL2CPP VM)编写了一个解释器,解释执行IL代码指令 + 使用的是AOT的数据内存对象
正常IL2CPP 执行: 数据内存 + 代码逻辑指令(二进制机器指令);
huatuo IL2CPP 执行:数据内存(GameObject)+ 代码逻辑指令(二进制机器指令)+ IL代码指令解释执行
所以huatuo在热更的时候,可以随意的继承所使用的GameObject、MonoBehvaviour;
huatuo在使用数据对象时,这个数据对象就是AOT里的东西,热更项目的类型编译进去就可以了;
huatuo在执行时就是,解释执行IL new GameObject ---> new AOT的GameObject对象;
热更流程:
热更 -----> IL.dll ----> 运行的时候,huatuo加载IL.dll 来解释执行;
当有更新时,可以将IL.dll 编译发布,然后放在服务器上,客户端运行时检查更新,下载最新的IL.dll, 最后IL2CPP vm 转载IL.dll 就实现了热更新。
三、huatuo为什么性能高,比其他热更新方案的优势有哪些
优势:
1.huatuo直接使用的是AOT项目中的内存对象,内存的占用,跨域都没有问题;(性能好,内存占用少)
2.huatuo不用改变上次的开发习惯(不需要另外搞个虚拟机,搞个热更项目)
3.其他热更项目所不具备的功能,热更后,可以改变执行方式(
比如:原来是Lua、ILRuntime热更新的,从1.0 -到- 2.0,就算更新完成,执行方式不会变,一开始是解释执行,更新完,还是解释执行;
但是,huatuo,可以实现从1.0(的解释执行) --更新到---> 2.0(的直接AOT执行)
4.开发方式:huatuo不需要特殊的开发模式,直接Unity开发完就完事了。(不会有热更时的一些问题如:需要特殊的开发模式、需要热更项目、不能直接继承、接口导出等)
5.huatuo可以理论上更新任何代码,而普通的模式是 框架 + 热更,框架是不可以热更的。
四、huatuo热更新开发环境搭建与测试
环境准备:
unity
visula studio
IL2CPP for windows (不同平台有不同的IL2CPP,这里用的是windows平台)
Unity IL2CPP 下载 https://unity.com/releases/editor/whats-new
打开上面官网,选择自己Unity版本,然后在Component Installers下选择,你要下载的组件,这里下载 IL2CPP 根据你的平台下载即可。
huatuo准备:
a:huatuo核心代码库:IL代码指令解释执行;
b:IL2CPP_huotuo:IL2CPP的库,huatuo需要做一些补丁修改,不含huotuo核心代码 + huaduo核心代码运行的必要环境;
为何什么会分开呢?是因为IL2CPP是Unity维护的,为了应对Unity对它的变化,所以分开。
huatuo示例项目:从示例项目中启发,用到我们的项目中;
huatuo-trial
github 国外下载https://github.com/focus-creative-games
码云
国内下载https://gitee.com/focus-creative-games
要注意:huotuo-main(hybridclr-main)是huatuo的源项目、huotuo-trial(hybridclr_trial-main)示例项目、il2cpp_huotuo(il2cpp_plus-main)库项目、hybridclr_unity-main是Unity的包配置项目。
hybridclr_unityhttps://gitee.com/focus-creative-games/hybridclr_unity 打开后,点击克隆/下载---> HTTPS 链接 点击复制即可拿到该git链接。
准备好以后,就可以开始搭设了。
这里使用的是Unity2021.3.6.f1 hub3.0.1 Hybrid CLR是v2.1.0 il2cpp_plus是v2021-2.1.0
step:1打开Unity工程,在菜单栏Window ---> Package Manager ---> 选择+号 ---> Add package for dis...(从本地添加包)选择hybridclr_unity-main下的package.json,点击打开,即可添加进来。
这一步,也可以直接选择使用git链接里的版本,操作如下:
在PackageManager界面,点击+号后,选择 ...from git URL选项,然后复制(拿到)是上面hybridclr_unity里的git链接,粘贴进去,点击Add即可,会拿到最新的插件包。
step:2 在Unity工程中,菜单栏中会看到 HybridCLR选项,打开HybridCLR ---> Intaller... --->显示未安装,点击下面的安装(静静的等待,如果没有报错,并且安装状态是已安装,就说明安装好了)恭喜你了,安装成功!
step:3.解压出示例项目(huatuo-trial)
step4:多个项目,Unity ADF机制,代码越多,每次修改一下,要全部编译,时间消耗比较麻烦;
ADF机制,将项目分成多个不同的工程,然后每次修改后,只编译你自己所在的工程(节约编译时间),
huatuo ---> 就可以针对不同的dll(做热更新),不同的功能不同的dll。
step5:普通的直接走AOT,把这些DLL编译出来,生成到机器指令里,运行;
然后在热更新的时候,ILCPP vm先加载我们的IL.dll就可以更新了。
(也就意味着,我们在使用huatuo时,这几块的可以分开开发)
step6:运行一下热更项目。
step6a:如何来分项目出来 ---> 构建不同的.dll (使用Unity ADF)
在Unity中,在Project视口下Asstes下新建一个分项目的目录(GFGame),然后在这个目录里,右击选择Create ---> Assembly Definition ,就有了一个分项目集,然后在此文件加下创建脚本,
在vs中打开,就会看到,他是独立在一个集下的,也就意味着,它可以单独打出一个dll出来(热更新就可以依据这个dll做独立功能或分项目)。
step6b:构建一下dll ----> 发布热更新的时候就要可以使用这里的dll
使用huatuo的功能,菜单栏HybridCLR--->CompileDll ---> ActiveBuildTarge
静等几秒,构建完成后,会有提示Finish!
目前的版本目录是放在跟Assets同级的HybridCLR目录里,具体如下:
step6c:热更.dll + 游戏资源 ----> 热更资源.dll 二进制资源 ---> 将这些资源打包(ab包,addressbale等)
打ab包,根据项目不同,按照项目的设计即可。 --->打出ab包
step6d:打出的ab包放在了StreammingAssets目录下,然后根据实际需要,放到服务器上。
到此就做到了热更新。
到此示例项目就算运行起来了。
五、huatuo热更新关键源码分析
5.1 打包.dll ---->分项目分功能打包dll
5.2 打包ab包 ----> 将资源打包成ab包
5.3 Editor扩展
5.4 如果启动热更新逻辑:
1.LoadDll (装载dll),这些dll就是代码逻辑热更新的关键
在这里的逻辑可以根据实际情况做调整,比如,在这里装载时,可以先判断下本地和服务器的dll是否不一致(是否需要跟新),如果不需要,就可以直接使用AOT里的,否则更新加载即可。(这里的逻辑时直接更新了,没有判断是否一致)