观其大略之HybridCLR学习笔记

问题背景

1 现有热更方案的开发效率、性能没有到达极限,还有提升的空间

2 ios多平台政策导致热更新受限问题,ios禁止jit。根据我查找的资料,ios的代码段启动的时候就确定了,不能增加新的代码段。IOS封了内存(或者堆)的可执行权限,相当于变相的封锁了JIT这种编译方式,即机器码被禁止映射到内存。所以不能运行时生成机器码执行。

目标

研发一个使用c#的热更新方案,既有开发效率又有运行效率

原理

灵感来源于:mixed mode execution

unity的il2cpp runtime额外提供了interpreter模块,将它们由纯AOT运行时改造为AOT + Interpreter混合运行方式

简明说法:c#代码通过il2cpp转换为c++代码,此时接入c++实现的HybridCLR,完美契合

HybridCLR做了以下几点工作

实现了一个高效的元数据(dll)解析库

改造了元数据管理模块,实现了元数据的动态注册

实现了一个IL指令集到自定义的寄存器指令集的compiler

实现了一个高效的寄存器解释器

额外提供大量的instinct函数,提升解释器性能

概念和术语

Hybrid

是一个热更方案,实现方式为AOT+Interpreter 混合runtime,进而原生支持动态加载assembly

寄存器解释器

解释器就是HybridCLR实现的解释执行自定义指令集的虚拟机。和基于栈的解释器相对,显著区别是有没有大量依赖出栈、入栈来操作完成运算。

使用寄存器式虚拟机没有基于栈的虚拟机在拷贝数据而使用的大量的出入栈(push/pop)指令。同时指令更紧凑更简洁。但是由于显示指定了操作数,所以基于寄存器的代码会比基于栈的代码要大,但是由于指令数量的减少,其实没有大多少。

AOT代码

unity打包时就进包的代码

AOT

AOT 即提前编译,可以生成被直接执行的二进制代码

热更新代码

动态加载执行的代码

instinct函数

build-in function,内置函数,指编译器实现的函数,这里指这些函数对效率帮助很大,喊666吧

JIT

Just-in-time compilation,缩写为JIT;又译及时编译、实时编译。通俗的说是,源代码、中间代码直接编译成机器码执行

Differential Hybrid Execution(DHE) 差分混合执行技术

可以对AOT dll任意增删改,会智能地让变化或者新增的类和函数以interpreter模式运行,但未改动的类和函数以AOT方式运行,让热更新的游戏逻辑的运行性能基本达到原生AOT的水平。

将标记为DHE的程序集也打入主包中,运行后再加载最新的热更新dll。执行过程中,调用某个DHE程序集的函数时,如果函数未发生变化,则直接调用原生的AOT实现,否则以解释方式执行最新的代码。

通俗的说:和打包进主包的代码对比,不一样就用热更代码,因为大部分都不会改,所以整体效率接近原生

注意事项

代码剪裁

Assets/link.xml,这个是不能热更的,未来需要使用的类型一定要预留在配置文件里面

使用HybridCLR.Editor.HotUpdate.MissingMetadataChecker检查是否使用了被剪裁的代码

这块一定要注意!!!如果link.xml里没有预留,后面想用只能换主包了!

问一问

热更新流程

1 按照依赖加载所有的Dll

2 执行热更代码,这里有多种方式,看文档:加载和运行 | HybridCLR

热更新资源和热更新脚本的加载顺序

先加载代码再加载资源

热更新的Dll里面能不能增加新的类和方法?

可以

能增加新的热更程序集吗?

可以

参考资料

MonoBehaviour支持 | HybridCLR

基于栈实现的虚拟机 & 基于寄存器实现虚拟机 - 简书

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

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

相关文章

JS 实现AES方式加密数据实现示例

简介:全称高级加密标准(英文名称:Advanced Encryption Standard),在密码学中又称 Rijndael 加密法,由美国国家标准与技术研究院 (NIST)于 2001 年发布,并在 2002 年成为有…

数据库搭建11.2

数据库之搭建 1、rpm -qa|grep 服务名称 案例:rpm -qa|grep mysql 2、将所有msyql的包删除干净 删除方法: (1)yum remove mysql * 删除linux中的数据库 (2)yum erase 包名 &#xff0…

Xilinx 7系列 FPGA硬件知识系列(一)——FPGA选型参考

目录 1.1 Xilinx-7系列产品的工艺级别 ​编辑1.2 Xilinx-7系列产品的特点 1.2.1 Spartan-7系列 1.2.2 Artix-7系列 1.2.3 Kintex-7系列 1.2.4 Virtex-7系列 1.3 Xilinx-7系列FPGA对比 1.3.1 DSP资源柱状图 ​1.3.2 Block RAM资源柱状图 ​1.3.3 高速串行收…

实验笔记之——Gaussian Splatting SLAM配置与测试

之前博客对基于3DGS的SLAM进行了调研 学习笔记之——3D Gaussian Splatting及其在SLAM与自动驾驶上的应用调研_3d gaussian splatting slam-CSDN博客文章浏览阅读3.2k次,点赞40次,收藏58次。论文主页3D Gaussian Splatting是最近NeRF方面的突破性工作&a…

C语言数组全面解析:从初学到精通

数组 1. 前言2. 一维数组的创建和初始化3. 一维数组的使用4. 一维数组在内存中的存储5. 二维数组的创建和初始化6. 二维数组的使用7. 二维数组在内存中的存储8. 数组越界9. 数组作为函数参数10. 综合练习10.1 用函数初始化,逆置,打印整型数组10.2 交换两…

Java面试篇【MyCat】常见面试题(2024最新)

Mycat 1.Mycat 分库分表中间件,将存放在一个数据库的数据存放在不同的多个数据库中。来分散负载。 scheme 逻辑库,对应mysql的数据库,一个逻辑库定义了包含的所有table.是数据库集群对外的统一访问接口。table 逻辑表,和物理数…

【Java EE】文件内容的读写⸺数据流

目录 🌴数据流的概念🌸数据流分类 🌳字节流的读写🌸InputStream(从文件中读取字节内容)🌻示例1🌻示例2🌻利用 Scanner 进行字符读取 🌸OutputStream(向文件中写内容&…

00. Nginx总结-错误汇总

/www/wangmingqu/index.html" is forbidden (13: Permission denied) 错误图片 错误日志 2024/01/09 22:26:27 [error] 1737#1737: *1 "/www/wangmingqu/index.html" is forbidden (13: Permission denied), client: 192.169.1.101, server: www.wangmingqu.c…

算法:滑动窗口

文章目录 例题1:长度最小的子数组例题2:无重复字符的最长子串例题3:最大连续1的个数 III例题4:将 x 减到 0 的最小操作数例题5:水果成篮例题6:找到字符串中所有字母异位词例题7:串联所有单词的子…

碳视野|全国首个ESG区域行动方案通过,上海政府推进ESG有八“要”

引领绿色转型,共筑低碳未来!AMT企源碳管理团队深入解读碳领域政策、概念及标准,分享实践经验,助力产业绿色发展。我们启动“碳视野、碳课堂、碳实践”三大专栏,紧跟碳行业政策动态,以“科普实践分享”为核心…

【python】六个常见爬虫案例【附源码】

大家好,我是博主英杰,整理了几个常见的爬虫案例,分享给大家,适合小白学习 一、爬取豆瓣电影排行榜Top250存储到Excel文件 近年来,Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序&a…

STM32 GPIO的几种工作模式

介绍STM32 GPIO的几种工作模式 1、输出模式 STM32的引脚输出有两种方式: 1、推挽输出 2、开漏输出 1.1 推挽输出 当引脚设置为推挽输出时,P-MOS和N-MOS共同配合工作。 当使用HAL库 //该函数的作用就是将P-MOS导通,N-MOS关…

SqlServer中连续号及断号查询—附源码

效果如下图所示: SqlServer中连续号及断号查询SQL如下: --1.定义临时表 DECLARE TestTemp TABLE(TestCode NVARCHAR(50),TestNum INT )DECLARE DataTemp TABLE(TestCode NVARCHAR(50),TestNumStr NVARCHAR(100) )--2.插入测试数据 INSERT INTO TestT…

国产体脂方案——蓝牙体脂秤方案

蓝牙体脂秤采用的就是BIA生物电阻抗技术,用户仅需1次测量,就能知道身体的脂肪率,水分率,基础代谢率,肌肉量,骨量,蛋白质,BMI,体重,身体的得分,年龄…

Linux:kubernetes(k8s)pod的基础操作(6)

Linux:kubernetes(k8s)允许在任意节点使用kubectl命令(5)-CSDN博客https://blog.csdn.net/w14768855/article/details/136460090?spm1001.2014.3001.5501 我在前两张进行了基础环境的一系列搭建,现在就正…

深度学习_18_模型的下载与读取

在深度学习的过程中,需要将训练好的模型运用到我们要使用的另一个程序中,这就需要模型的下载与转移操作 代码: import math import torch from torch import nn from d2l import torch as d2l import matplotlib.pyplot as plt# 生成随机的…

NFTScan :什么是 ERC-404?深入解读 NFT 协议的未来

上月初,ERC-404 成为最首要热门的话题,ERC-404 是由 Pandora 团队在 2 月初为创作者和开发者等开源的实验性代币标准,其混合 ERC-20 / ERC-721 实现,具有原生流动性和碎片化等特点。伴随着早期的发展,越来越多参与者开…

win10安全中心误删文件怎么办?解析恢复与预防策略

在使用Windows 10的过程中,许多用户依赖于其内置的安全中心来保护电脑免受恶意软件的侵害。然而,有时安全中心的误判可能导致重要文件被错误地删除。当面对这种情况时,了解如何恢复误删的文件并掌握预防措施显得尤为重要。本文将为您详细解析…

java常用技术栈,java面试带答案

前言 我们从一个问题引入今天的主题。 在日常业务开发中,我们可能经常听到 DBA 对我们说“不要”(注意:不是禁止)使用 join,那么为什么 DBA 对 join 这么抵触呢?是 join 本身有问题,还是我们使…

私募证券基金动态-24年2月报

成交量:2月日均9492.60亿元 2024年2月A股两市日均成交9492.60亿元,环比增加30.38%、同比增加5.77%。2月整体15个交易日,有4个单日交易日成交金额过万亿,单日交易日最高成交金额为13576.43亿元(2月28日)&am…