观其大略之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,一经查实,立即删除!

相关文章

ChatGPT使用的SSE协议接口怎么做测试

SSE是server-sent events协议简称,SSE协议主要是依托于HTTP链接用来从服务端将消息、信息、事件推动给客户端的协议。 SSE简介 SSE最近突然的被很多人关注还有一个主要原因就是ChatGPT等大模型的聊天类系统就采用了SSE协议。在使用ChatGPT的时候,输入Prompt后的反馈是逐渐的…

vite 自动导入组件样式插件及其原理(vite-plugin-style-import)

Vite 是一个快速的现代化前端构建工具。它在开发过程中使用了 ES 模块的原生导入方式,可以实现快速的冷启动和热模块替换。为了支持自动导入组件样式,Vite 提供了一个插件叫做 vite-plugin-style-import。 vite-plugin-style-import 插件是一个 Vite 的…

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…

Oracle 提示(hint)方法:use_nl

select /* index(e) index(d) use_nl(e d) */ * from emp e inner join dept d on e.deptnod.deptno where e.ename :b1 or d.dname :b2; USE_NL 是一个提示(hint),用于指示查询优化器使用"NESTED LOOPS"连接方式。该提示告诉…

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 高速串行收…

结构体的基本使用

在C语言中,结构体(Struct)是一种自定义的数据类型,它允许你将多个不同类型的变量组合成一个单一的类型。结构体在组织和处理具有实体属性的数据时非常有用,如学生、汽车、坐标点等。它们是数据封装的基础。 定义结构体…

实验笔记之——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:串联所有单词的子…

【低显存】 diffusion 爆显存的解决方法

降低分辨率降低通道数使用latent diffusion,例如stable使用低精度训练 下面将分别讲解如何使用这些方法。 使用latent diffusion 目前的主流模型都用了encoder降低中间层resolution,但是有一些比较老的工作,比如sr3,还是老架构…

碳视野|全国首个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,体重,身体的得分,年龄…