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的一个商业版本才提供的技术支持。
这个了解不多,大家在官网查看即可。
相关文章:

HybridCLR原理中的重点总结
序言 该文章以一个新手的身份,讲一下自己学习的经过,大家更快的学习HrbirdCLR。 我之前的两个Unity项目中,都使用到了热更新功能,而热更新的技术栈都是用的HybridCLR。 第一个项目本身虽然已经集成好了热更逻辑(使用…...

昇思学习打卡-14-ResNet50迁移学习
文章目录 数据集可视化预训练模型的使用部分实现 推理 迁移学习:在一个很大的数据集上训练得到一个预训练模型,然后使用该模型来初始化网络的权重参数或作为固定特征提取器应用于特定的任务中。本章学习使用的是前面学过的ResNet50,使用迁移学…...
软件开发面试题C#,.NET知识点(续)
1.C#中的封装是什么,以及它的重要性。 封装(Encapsulation) 是面向对象编程(OOP)的一个基本概念。它指的是将对象的状态(属性)和行为(方法)绑定在一起,并且将…...
2019年美赛题目Problem A: Game of Ecology
本题分析: 本题想要要求从实际生物角度出发,对权力游戏中龙这种虚拟生物的生态环境和生物特性进行建模,感觉属于比较开放类型的题目,重点在于参考生物的选择,龙虽然是虚拟的但是龙的生态特性可以参考目前生物圈里存在…...

沙龙回顾|MongoDB如何充当企业开发加速器?
数据不仅是企业发展转型的驱动力,也是开发者最棘手的问题。前日,MongoDB携手阿里云、NineData在杭州成功举办了“数据驱动,敏捷前行——MongoDB企业开发加速器”技术沙龙。此次活动吸引了来自各行各业的专业人员,共同探讨MongoDB的…...
云端编码:将您的技术API文档安全存储在iCloud的最佳实践
云端编码:将您的技术API文档安全存储在iCloud的最佳实践 作为一名技术专业人士,管理不断增长的API文档库是一项挑战。iCloud提供了一个无缝的解决方案,允许您在所有设备上存储、同步和访问您的个人技术API文档。本文将指导您如何在iCloud中高…...
在Spring Boot项目中集成单点登录解决方案
在Spring Boot项目中集成单点登录解决方案 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代的企业应用中,单点登录(Single Sign-On, SSO)解决方案是确保用户…...

Java-常用API
1-Java API : 指的就是 JDK 中提供的各种功能的 Java类。 2-Scanner基本使用 Scanner: 一个简单的文本扫描程序,可以获取基本类型数据和字符串数据 构造方法: Scanner(InputStream source):创建 Scanner 对象 Sy…...
Python从Excel表中查找指定数据填入新表
#读取xls文件中的数据 import xlrd file "原表.xls" wb xlrd.open_workbook(file) #读取工作簿 ws wb.sheets()[0] #选第一个工作表 data [] for row in range(7, ws.nrows): name ws.cell(row, 1).value.strip() #科室名称 total1 ws.cell(row, 2…...

从零开始实现大语言模型(三):Token Embedding与位置编码
1. 前言 Embedding是深度学习领域一种常用的类别特征数值化方法。在自然语言处理领域,Embedding用于将对自然语言文本做tokenization后得到的tokens映射成实数域上的向量。 本文介绍Embedding的基本原理,将训练大语言模型文本数据对应的tokens转换成Em…...

视频怎么压缩变小?最佳视频压缩器
即使在云存储和廉价硬盘空间时代,大视频文件使用起来仍然不方便。无论是存储、发送到电子邮件帐户还是刻录到 DVD,拥有最好的免费压缩软件可以确保您快速缩小文件大小,而不必担心视频质量下降。继续阅读以探索一些顶级最佳 免费视频压缩器选项…...

LLM - 绝对与相对位置编码 与 RoPE 旋转位置编码 源码
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140281680 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Transformer 是基于 MHSA (多头自注意力),然而,MHSA 对于位置是不敏感…...
B3917 [语言月赛 202401] 小跳蛙
OK 挠~ stop here~ 好啊,现在呢,把手头的事情先放一放啊,我们来做道练习 OK? 好啊来: 小跳蛙 题目描述 有 𝑛−1 只小跳蛙在池塘中,依次被编号为 1,2,⋯ ,𝑛−1。池塘里有 &am…...

Bash ——shell
Bash作为用户与操作系统之间的接口,让用户通过命令行输入各种指令来控制和操作计算机系统。 shell的两种解释: 1.linux命令解释器 Terminal 终端 ——》shell命令 ——》 Linux kernel (内核) Linux内核的作用: 1.…...

PyTorch复现PointNet——模型训练+可视化测试显示
因为项目涉及到3D点云项目,故学习下PointNet这个用来处理点云的神经网络 论文的话,大致都看了下,网络结构有了一定的了解,本博文主要为了下载调试PointNet网络源码,训练和测试调通而已。 我是在Anaconda下创建一个新的…...

分享五款软件,成为高效生活的好助手
给大家分享一些优秀的软件工具,是一件让人很愉悦的事情,今天继续带来5款优质软件。 1.图片放大——Bigjpg Bigjpg是一款图片放大软件,采用先进的AI算法,能够在不损失图片质量的前提下,将低分辨率图片放大至所需尺寸。无论…...
代码随想录算法训练营DAY58|101.孤岛的总面积、102.沉没孤岛、103. 水流问题、104.建造最大岛屿
忙。。。写了好久。。。。慢慢补吧。 101.孤岛的总面积 先把周边的岛屿变成水dfs def dfs(x, y, graph, s):if x<0 or x>len(graph) or y<0 or y>len(graph[0]) or graph[x][y]0:return sgraph[x][y]0s1s dfs(x1, y, graph, s)s dfs(x-1, y, graph, s)s dfs(…...

韦尔股份:深蹲起跳?
利润大增7倍,是反转信号还是回光返照? 今天我们聊聊光学半导体龙头——韦尔股份。 上周末,韦尔股份发布半年业绩预告,预计上半年净利润13至14亿,同比增幅高达 754%至 819%。 然而,回首 2023 年它的净利仅 …...

docs | 使用 sphinx 转化rst文件为html文档
1. 效果图 book 风格。 优点: 极简风格右边有标题导航左侧是文件导航,可隐藏 2. 使用方式 reST 格式,比markdown格式更复杂。 推荐使用 book 风格。 文档构建工具是 sphinx,是一个python包。 $ pip3 list | grep -i Sphinx …...

【ChatGPT 消费者偏好】第二弹:ChatGPT在日常生活中的使用—推文分享—2024-07-10
今天的推文主题还是【ChatGPT & 消费者偏好】 第一篇:哪些动机因素和技术特征的组合能够导致ChatGPT用户中高和低的持续使用意图。第二篇:用户对ChatGPT的互动性、性能期望、努力期望以及社会影响如何影响他们继续使用这些大型语言模型的意向&#x…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...