一句话说说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 下载 icon-default.png?t=N3I4https://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里的,否则更新加载即可。(这里的逻辑时直接更新了,没有判断是否一致)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐