国内一家做国外酒店团购的网站,有想做企业网站建设,郴州新网二手房出售,用数据库做网站序言
该文章以一个新手的身份#xff0c;讲一下自己学习的经过#xff0c;大家更快的学习HrbirdCLR。
我之前的两个Unity项目中#xff0c;都使用到了热更新功能#xff0c;而热更新的技术栈都是用的HybridCLR。
第一个项目本身虽然已经集成好了热更逻辑#xff08;使用…序言
该文章以一个新手的身份讲一下自己学习的经过大家更快的学习HrbirdCLR。
我之前的两个Unity项目中都使用到了热更新功能而热更新的技术栈都是用的HybridCLR。
第一个项目本身虽然已经集成好了热更逻辑使用HybridCLR但是热更逻辑都是主程在处理的而我主要是做UI的界面和业务逻辑功能基本没接触到HybridCLR。
而第二个项目需要自己把热更新功能搭建起来于是就使用了第一个项目的已经完成的HybridCLR的框架代码根据第一个项目做修改来自己一点点把HybridCLR搭建起来。
所以我现在是一个处理好了HybridCLR逻辑但是不懂原理的Unity新手状态。
于是引出这个文章该文章不是讲解HybridCLR在Unity下的热更实现细节而是讲HybridCLR的需要注意原理重点。
重点总结
用HybridCLR的官网上的一个简介来引出重点。 HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案。 HybridCLR扩充了il2cpp的代码使它由纯AOT runtime变成AOTInterpreter 混合runtime进而原生支持动态加载assembly使得基于il2cpp backend打包的游戏不仅能在Android平台也能在IOS、Consoles等限制了JIT的平台上高效地以AOTinterpreter混合模式执行从底层彻底支持了热更新。 HybridCLR不仅支持传统的全解释执行模式还开创性地实现了 Differential Hybrid Execution(DHE) 差分混合执行技术。即可以对AOT dll任意增删改会智能地让变化或者新增的类和函数以interpreter模式运行但未改动的类和函数以AOT方式运行让热更新的游戏逻辑的运行性能基本达到原生AOT的水平。 这是HybridCLR官网开头的一个简介这段文字包含了几个比较重要的信息如果没有了解过的同学对于这些信息就不能抓住。
重点主要有以下几个
IL2CPP
AOT
Interpreter
DHE IL2CPP
我们先从字面理解IL意思就是中间语言Intermediate LanguageCPP是C。所以IL2CPP意思就是中间语言转换为C。
再让我们来看一下Unity官方文档的说法 The IL2CPP (Intermediate Language To C) scripting backend is an alternative to the Mono backend. IL2CPP provides better support for applications across a wider range of platforms. The IL2CPP backend converts MSIL (Microsoft Intermediate Language) code (for example, C# code in scripts) into C code, then uses the C code to create a native binary file (for example, .exe, .apk, or .xap) for your chosen platform. 首先希望大家能在不翻译的情况下阅读完这个概述。如果实在不理解其中的一些单词可以在整句翻译之后再回来查看这段文字的意思很多情况下英文的理解和中文是不一样的。
其次在理解了以上概述的意思之后我们来查看Unity中IL2CPP的配置在Project Setting - Player 选项里 Scripting Backend 有两个选项Mono和IL2CPP。
然后现在我们得知IL2CPP是将C#转换为中间语言再将中间语言转换为C再转换为我们所编译的平台对应的二进制文件.exe、.apk或.xap。
而Mono是通过在发布平台生成对应的Mono VMMono VM即Mono的解释器有关解释器之后会说到来处理的。
以上是IL2CPP和Mono这两个选项的主要区别。
在我个人看来中间语言以后会有比较大的发展因为像现在Javascript等语言也在依托于中间语言获得了较大的性能提升。
大家对IL2CPP还想更详细的了解的话可以查看
https://blog.csdn.net/Devil_MayCare/article/details/106378192
https://zhuanlan.zhihu.com/p/19972689 AOT
AOT的解释
AOT的全称是Ahead Of Time字面意思是运行前编译。
程序的运行按编译方式来区分的话主要有两种方式静态编译和动态编译。
而我们通常也可以将静态编译称为AOT。
静态编译
静态编译是在运行前被翻译为机器码可以直接编译目标平台识别和运行。
优点这样的程序运行速度相对于动态编译来说会快很多
缺点就是在我们修改代码的时候每次测试修改过的代码都会执行一次编译这样相对于动态编译来说开发效率会低一些。
还有一个最重要的缺点就是静态编译如果要修改已经发布的程序必须要打包然后替换掉线上的程序。
动态编译
动态编译是在运行的时候需要有一个解释器解释器会随着程序一起打包才被对应语言的解释器进行解释成机器语言然后再由机器运行。
缺点就是在运行时的速度比静态编译慢很多
优点在开发时不需要等待编译的过程相对来说开发效率会高一些。
同样最重要的优点动态编译可以直接修改包里的代码替换了包里的代码后就可以完成程序更新的需求。
而我们也可以将动态编译称为JIT。
JIT的解释
即Just-In-Time字面意思是即时编译也可以称为运行时编译。
对应关系
所以我们从AOT整理出静态编译再整理出动态编译再整理出JIT。
现在我们整理出Unity根据编译类型来划分的对应关系
静态编译-AOT-IL2CPP
那么动态编译也是有对应关系的
动态编译-JIT-Mono
其中AOT-IL2CPP和JIT-Mono这两条对应关系的原理在IL2CPP这一节中已经讲过大家可以往回看一下。
各种编译类型的语言
静态编译(AOT)主要是以C/C等语言为主而动态编译(JIT)主要是以lua、Javascript、python等为主。
还有就是有些语言既可以支持AOT也支持JIT其中就包括C#、Javascript前面就说过现在Js也可以处理为中间语言再转换为C。
热更需求
在Unity开发出来的游戏会需要上传到对应平台Android的Google Play、iOS的AppStore然后用户使用Android或iOS对应平台上下载下来。
那么在我们更新了一点功能之后用户又需要从Android或iOS平台上再下载一次这是比较不友好的用户体验。
那么现在我们的需求就是在我们更新了功能之后用户打开游戏直接下载我们更新的功能代码和图片资源等下载更新的功能代码和图片资源到平台的可读写目录速度较快不怎么影响用户体验直接就能体验到新功能。
以上这个需求就是热更新。
遇到问题
那么现在我们的情况是
IL2CPP-速度快但是不能热更新前面说过了IL2CPP需要编译打包再替换平台上的程序。
JIT-速度慢但是能热更将代码或资源下载到平台的可读写目录等程序运行的时候会自动运行平台的可读写目录中的代码。
所以现在的想法是可不可以将IL2CPP改造为可以热更的IL2CPP于是需要加上Interpreter组成了HybridCLR的官方解释中的AOTInterpreter。
这也就是HybrildCLR要解决的问题。 Interpreter
Interpreter的意思是解释器和动态语言中提到的解释器是同一个意思是动态语言实现动态更新的必要逻辑像前面提到的Mono VM就是解释器而Javascript的解释器有V8、SpiderMonkey等。
但是HybridCLR中的Interpreter和其他语言的Interpreter又有一个区别那就是HybridCLR的Interpreter只处理dll库的选择不是解释dll库中的代码。
这是HybridCLR能继续保持静态编译AOT类型的一个关键。
这种技术是在Mixed Mode Execution中获得的启发。
Tips与解释器对应的就是编译器编译器有LLVM、GCC等。大家有兴趣可以自己查询。 DHE
这是HybridCLR的一个商业版本才提供的技术支持。
这个了解不多大家在官网查看即可。