HybridCLR原理中的重点总结

news2024/9/20 15:00:35

序言

该文章以一个新手的身份,讲一下自己学习的经过,大家更快的学习HrbirdCLR。

我之前的两个Unity项目中,都使用到了热更新功能,而热更新的技术栈都是用的HybridCLR。

第一个项目本身虽然已经集成好了热更逻辑(使用HybridCLR),但是热更逻辑都是主程在处理的,而我主要是做UI的界面和业务逻辑功能,基本没接触到HybridCLR。

而第二个项目需要自己把热更新功能搭建起来,于是就使用了第一个项目的已经完成的HybridCLR的框架代码,根据第一个项目做修改,来自己一点点把HybridCLR搭建起来。

所以我现在是一个处理好了HybridCLR逻辑,但是不懂原理的Unity新手状态。

于是引出这个文章,该文章不是讲解HybridCLR在Unity下的热更实现细节,而是讲HybridCLR的需要注意原理重点。

重点总结

用HybridCLR的官网上的一个简介来引出重点。

HybridCLR是一个特性完整、零成本、高性能、低内存近乎完美的Unity全平台原生c#热更方案。

HybridCLR扩充了il2cpp的代码,使它由纯AOT runtime变成AOT+Interpreter 混合runtime,进而原生支持动态加载assembly,使得基于il2cpp backend打包的游戏不仅能在Android平台,也能在IOS、Consoles等限制了JIT的平台上高效地以AOT+interpreter混合模式执行,从底层彻底支持了热更新。

HybridCLR不仅支持传统的全解释执行模式,还开创性地实现了 Differential Hybrid Execution(DHE) 差分混合执行技术。即可以对AOT dll任意增删改,会智能地让变化或者新增的类和函数以interpreter模式运行,但未改动的类和函数以AOT方式运行,让热更新的游戏逻辑的运行性能基本达到原生AOT的水平。

 这是HybridCLR官网开头的一个简介,这段文字包含了几个比较重要的信息,如果没有了解过的同学,对于这些信息就不能抓住。

重点主要有以下几个:

IL2CPP

AOT

Interpreter

DHE

IL2CPP

我们先从字面理解,IL意思就是中间语言(Intermediate Language),CPP是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 VM(Mono 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的官方解释中的AOT+Interpreter。

这也就是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的一个商业版本才提供的技术支持。

这个了解不多,大家在官网查看即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1916633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【排序 - 冒泡排序】

当我们谈论经典的排序算法时,冒泡排序(Bubble Sort)往往是最先被提及的一种。尽管它在实际应用中不太常见,但冒泡排序的简单易懂,有助于理解排序算法的基本原理和思想。 冒泡排序的基本原理 冒泡排序是一种基础的交换…

Git的基本知识点 + GitBash安装Pacman + Git命令含有中文,终端输出中文乱码

Git的基本知识点:整理自以下作者的文章繁华似锦Fighting的文章https://www.jianshu.com/nb/49854893另外还补充了git ls-file、.gitignore 等内容,涉及具体操作,还有命令总结。简略版可以看以上作者的文章,详细版可以看网盘里面的…

【企业级监控】源码部署Zabbix与监控主机

Zabbix企业级分布式监控 文章目录 Zabbix企业级分布式监控资源列表基础环境一、LNMP环境搭建(在zbx主机上)1.1、配置Yum仓库1.1.1、下载阿里云的仓库文件1.2.2、安装PHP7的仓库1.2.3、生成Mariadb10.11的仓库文件1.2.4、快速重建Yum缓存 1.2、安装PHP7.4…

Golang | Leetcode Golang题解之第228题汇总区间

题目&#xff1a; 题解&#xff1a; func summaryRanges(nums []int) (ans []string) {for i, n : 0, len(nums); i < n; {left : ifor i; i < n && nums[i-1]1 nums[i]; i {}s : strconv.Itoa(nums[left])if left < i-1 {s "->" strconv.It…

数学建模美赛经验小结

图片资料来自网络所听讲座&#xff0c;感谢分享&#xff01;

《C++设计模式》状态模式

文章目录 一、前言二、实现一、UML类图二、实现 一、前言 状态模式理解最基本上的我觉得应该也是够用了&#xff0c;实际用的话&#xff0c;也应该用的是Boost.MSM状态机。 相关代码可以在这里&#xff0c;如有帮助给个star&#xff01;AidenYuanDev/design_patterns_in_mode…

Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce

章节内容 上节我们完成了&#xff1a; Sqoop 介绍Sqoop 下载配置环境等Sqoop 环境依赖&#xff1a;Hadoop、Hive、JDBC 等环境补全 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机…

javaweb图书商城系统带万字文档网上书城java项目java课程设计java毕业设计

文章目录 图书商城系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 图书商城系统 一、项目演示 网上书城 二、项目介绍 语言&#xff1a;java 数据库&#xff1a;…

如何用 Python 远程控制 Windows 服务器?

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 在信息时代的洪流中&#xff0c;掌握一门编程语言已经成为一项必备技能。Python&#xff0c;这门以简洁、易学、强大著称的编程语言&#xff0c;更是成为无数开发者的大宝剑。今天&…

maven——插件创建maven工程(了解即可)

对于之前手一个个文件夹创建&#xff0c;可能会觉得麻烦&#xff0c;maven出了个插件&#xff0c;可以直接创建出来。 使用这个指令就可以生成&#xff0c;是使用模板生成的&#xff0c;模板要告诉他用哪一个 告诉插件用的哪个模板&#xff1a; 范例&#xff1a; 创建java…

Nginx实现服务器端集群搭建/Nginx实现动静分离/Nginx高可用解决方案/Nginx与Tomcat部署

Nginx实现服务器端集群搭建 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解&#xff0c;我们都知道了Nginx在高并发场景和处理静态资源是非常高性能的&#xff0c;但是在实际项目中除了静态资源还有就是后台业务代码模块&#xff0c;一般后台业务都会被部署在…

Java-常用API

1-Java API &#xff1a; 指的就是 JDK 中提供的各种功能的 Java类。 2-Scanner基本使用 Scanner&#xff1a; 一个简单的文本扫描程序&#xff0c;可以获取基本类型数据和字符串数据 构造方法&#xff1a; Scanner(InputStream source)&#xff1a;创建 Scanner 对象 Sy…

Python地图可视化三大秘密武器

Python地图可视化库有大家熟知的pyecharts、plotly、folium&#xff0c;还有稍低调的bokeh、basemap、geopandas&#xff0c;也是地图可视化利器。 首先介绍下bokeh bokeh擅长制作交互式图表&#xff0c;当然在地图展示方面也毫不逊色。 Bokeh支持google地图、geojson数据的地…

枚举trick,CF 489D - Unbearable Controversy of Being

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 489D - Unbearable Controversy of Being 二、解题报告 1、思路分析 对于这种计算图形数目&#xff0c;最朴素的暴力无非是枚举每个顶点&#xff0c;这样时间复杂度会很高 策略往往是固定些点&#xff0c;…

在ROS (Robot Operating System) 中,查看话题(topics)

在ROS (Robot Operating System) 中&#xff0c;查看话题&#xff08;topics&#xff09;上发布的消息内容可以通过多种方式实现。以下是几种常用的方法&#xff1a; 1. 使用 rostopic echo 这是最直接的方式&#xff0c;可以用来实时显示话题上接收到的消息数据。命令格式如…

简单状压dp(以力扣464为例)

目录 1.状态压缩dp是啥&#xff1f; 2.题目分析 3.解题思路 4.算法分析 5.代码分析 6.代码一览 7.结语 1.状态压缩dp是啥&#xff1f; 顾名思义&#xff0c;状态压缩dp就是将原本会超出内存限制的存储改用更加有效的存储方式。简而言之&#xff0c;就是压缩dp的空间。 …

学习大数据DAY13 PLSQL基础语法2

目录 选择结构 IF语句 简单判断语句 带判断不成立语句 多判断语句 IF语句注意事项&#xff1a; CASE 语句 简单CASE语句 搜索型CASE语句 作业 循环语句 循环结构 简单循环 属性 描述 位置 场景 WHILE循环 属性 FOR循环 数值型for循环 数值型for循环的特性…

如何将若依vue升级到springboot3.x?

为了确保项目符合要求,Spring Boot 3.x 要求Java版本为17或更高。 1、修改根目录下的pom.xml文件 <!-- java.version版本8更换为17 --> <java.version>17</java.version><!-- 新增节点 --> <mybatis-spring-boot.version>3.0.3<

手撸俄罗斯方块(四)——渲染与交互

手撸俄罗斯方块&#xff08;四&#xff09;——渲染与交互 如何渲染游戏界面 我们知道&#xff0c;当我们看到页面先呈现图像时&#xff0c;实际上看到的是一张图片&#xff0c;多张图片按照一定的刷新频率进行切换&#xff0c;则变成了动态的视频。当刷新频率超过24Hz时&…

PDF 分割拆分 API 数据接口

PDF 分割拆分 API 数据接口 文件处理&#xff0c;PDF 高效的 PDF 分割工具&#xff0c;高效处理&#xff0c;可永久存储。 1. 产品功能 高效处理大文件&#xff1b;支持多语言字符识别&#xff1b;支持 formdata 格式 PDF 文件流传参&#xff1b;支持设置每个 PDF 文件的页数…