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…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...