当前位置: 首页 > news >正文

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倍&#xff0c;是反转信号还是回光返照&#xff1f; 今天我们聊聊光学半导体龙头——韦尔股份。 上周末&#xff0c;韦尔股份发布半年业绩预告&#xff0c;预计上半年净利润13至14亿&#xff0c;同比增幅高达 754%至 819%。 然而&#xff0c;回首 2023 年它的净利仅 …...

docs | 使用 sphinx 转化rst文件为html文档

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

【ChatGPT 消费者偏好】第二弹:ChatGPT在日常生活中的使用—推文分享—2024-07-10

今天的推文主题还是【ChatGPT & 消费者偏好】 第一篇&#xff1a;哪些动机因素和技术特征的组合能够导致ChatGPT用户中高和低的持续使用意图。第二篇&#xff1a;用户对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 抗噪声…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...