HybridCLR原理中的重点总结

序言

该文章以一个新手的身份,讲一下自己学习的经过,大家更快的学习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.mzph.cn/pingmian/44636.shtml

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

相关文章

Java | Leetcode Java题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; class Solution {public int calculate(String s) {Deque<Integer> stack new ArrayDeque<Integer>();char preSign ;int num 0;int n s.length();for (int i 0; i < n; i) {if (Character.isDigit(s.charAt(i))) {num…

Elasticseach学习

概念 是一个开源的分布式搜索引擎&#xff0c;可以应用于搜索、日志监控等 倒排索引 正向索引&#xff1a;基于文档id创建索引。查询词条时必须先找到文档&#xff0c;而后判断是否包含词条 倒排索引&#xff1a;对文档内容分词&#xff0c;对词条创建索引&#xff0c;并记录…

docker-compose mongodb 副本集

准备 cd /opt/mongos 把 3 个节点的数据目录创建好 mkdir -p ./mongos/{mongo1,mongo2,mongo3} mongodb 使用 keyFile 进行认证&#xff0c;副本集群中的每个节点的 mongodb 使用 keyFile 的内容作为认证其他成员的共享密码。mongodb 实例只有拥有正确的 keyFile 才可以加入副…

HCIP课堂笔记

第一章 1、数据转换---目标&#xff1a;抽象语言---二进制---电信号 2、应用程序---接收参数和指令&#xff08;编码&#xff1a;接收传递给计算机指令参数最终转换为二进制&#xff09; 3、二进制---电信号 4、对于整个互联网而言指定了统一的标准——OSI/RM参考模型 &…

GitLab和Git

GitLab保姆级教程 文章目录 GitLab保姆级教程一、GitLab安装二、添加组和用户三、新增项目四、Git上传项目说明五、命令行指引 根据以下说明从计算机中上传现有文件&#xff1a;六、创建与合并分支七、GitLab回滚到特定版本八、数据备份与恢复九、docker中创建gitlab GIT 常用命…

“金山-讯飞”杯2024年武汉理工大学程序设计竞赛 A. Mobiusp败走***(思维题-点双连通分量、连通性)

题目 思路来源 官方题解 题解 手玩发现&#xff0c;能换的话&#xff0c;当且仅当.和1在一个环里&#xff0c;而这就是点双连通分量 所以最优策略是先把.换到(x,y)的位置&#xff0c;然后判断.和1在不在一个环里 也就是&#xff1a; 1. 判断删掉1时&#xff0c;.和(x,y)联…

vue 搭建 pinia

文章目录 环境设置存储读取数据【 storeToRefs】借助storeToRefs将store中的数据转为ref对象&#xff0c;方便在模板中使用【getters】当state中的数据&#xff0c;需要经过处理后再使用时&#xff0c;可以使用getters配置【$subscribe】通过 store 的 $subscribe() 方法侦听 s…

SAP与易链SRM系统集成案例

一、项目环境 重庆润通控股&#xff08;集团&#xff09;有限公司成立于2007年&#xff0c;是一家集合汽柴油动力及终端、摩托车、储能电源、汽车零部件、金融服务等产业的多元化集团公司。现拥有员工超4000人&#xff0c;业务遍布全球80多个国家及地区&#xff0c;2021年营…

文件加密软件谁好用丨2024文件加密软件TOP6推荐

在数字化时代&#xff0c;数据安全已成为企业和个人不可忽视的重要议题。随着数据泄露事件频发&#xff0c;文件加密软件成为了保护敏感信息的首选工具。 本文将为您推荐2024年度最值得信赖的六大文件加密软件&#xff0c;帮助您选择最适合自己需求的加密工具。 1. 域智盾 软…

手机容器化 安装docker

旧手机-基于Termux容器化 1、安装app 在手机上安装Termux或ZeroTermux&#xff08;Termux扩展&#xff09; 1.1 切换源 注&#xff1a;可以将termux进行换源&#xff0c;最好采用国内源&#xff0c;例如&#xff1a;清华源等 更新包列表和升级包&#xff08;可选&#xff0…

数智驱动丨zAIoT 连续落地军工、科研院所和机械制造场景,推动数智化转型升级...

引言 在这个万物互联的时代&#xff0c;科技的进步正以不可阻挡之势&#xff0c;深刻地影响并重塑我们的生产和生活方式。数智化转型升级在各个领域展现出强大的动力&#xff0c;已经成为推动社会向前发展的关键力量。 最近&#xff0c;云和恩墨自主研发的数据智能分析处理平台…

FUSE(用户空间文件系统)命令参数

GPT-4 (OpenAI) FUSE (Filesystem in Userspace)是一个允许创建用户空间文件系统的接口。它提供了一个API&#xff0c;让开发者在未修改内核代码的情况下&#xff0c;通过自己的程序实现文件系统。FUSE 文件系统通常通过 mount 命令来挂载&#xff0c;而且这个命令可以接受各…

时序分解 | Matlab基于ESMD极点对称模态分解

时序分解 | Matlab基于ESMD极点对称模态分解 目录 时序分解 | Matlab基于ESMD极点对称模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ESMD&#xff08;Extreme-point Symmetric Mode Decomposition&#xff09;是一种信号分解方法&#xff0c;用于提取信号中的模…

【C语言之高级编程】如何将指定变量或函数编译至固定的内存区域中?

如何将指定变量或函数编译至固定的内存区域&#xff1f; 1. 内存类型1.1 bss段&#xff08;Block Started by Symbol&#xff09;1.2 data段&#xff08;data segment&#xff09;1.3 text段&#xff08;code segment/text segment&#xff09;1.4 dec1.5 堆&#xff08;heap&a…

华为模拟器ensp中USG6000V防火墙web界面使用

防火墙需要配置 新建拓扑选择USG6000V型号 在防火墙中导包 忘记截图了 启动设备 输入用户名密码 默认用户名&#xff1a;admin 默认密码&#xff1a;Admin123 修改密码 然后他会提示你是否要修改密码&#xff0c;想改就改不想改就不改 进入命令行界面 进入系统视图开启web…

7个外贸网站模板

Nebula独立站wordpress主题 Nebula奈卜尤拉wordpress主题模板&#xff0c;适合搭建外贸独立站使用的wordpress主题。 https://www.jianzhanpress.com/?p7084 Starling师大林WordPress独立站模板 蓝色橙色风格的WordPress独立站模板&#xff0c;适合做对外贸易的外贸公司搭建…

【C++】类和对象--类,实例化,this指针

文章目录 前言一、类1.1 类的定义1.2 类的书写和使用1.3 访问限定符1.4 类域 二、实例化2.1 实例化概念2.2 对象大小 三.this指针总结 前言 前面的几篇文章我们介绍了命名空间&#xff0c;inline&#xff0c;nullptr等C 中常见的的基础概念。今天的文章我们来介绍一些C中类与对…

数据结构 —— BellmanFord算法

数据结构 —— BellmanFord算法 BellmanFord算法检测负权值环BellmanFord和Dijkstra思想上的区别Dijkstra算法的思想Bellman-Ford算法的思想思想上的对比 我们今天来看一个算法BellmanFord算法&#xff0c;我们之前的Dijkstra算法只能用来解决正权图的单源最短路径问题。 Bell…

C语言入门基础题:奇偶 ASCII 值判断(C语言版)和ASCII码表,什么是ASCII码,它的特点和应用?

1.题目描述&#xff1a; 任意输入一个字符&#xff0c;判断其 ASCII 是否是奇数&#xff0c;若是&#xff0c;输出 YES &#xff0c;否则&#xff0c;输出 NO例如&#xff0c;字符 A 的 ASCI 值是 65 &#xff0c;则输出 YES &#xff0c;若输入字符 B(ASCII 值是 66)&#xff…

数据库的学习(5)

题目&#xff1a; 1、新增员工表emp和部门表dept create table dept (deptl int,dept name varchar(11)) charsetutf8; create table emp (sid int,name varchar(11),age int,worktime start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (…