观其大略之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.hqwc.cn/news/525704.html

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

相关文章

2024软件测试工具测评,总有一款适合你!

在软件开发周期中,测试是确保产品质量的关键环节。随着企业对于软件质量的要求日益提升,测试人员面临着前所未有的挑战,“工欲善其事必先利其器”,选择一款高效、实用的软件测试工具,不仅能够提升测试效率,…

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据】操作批量新增、分页查询(四)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本编码方式mybatis☑️☑️3.5.4lambda xml 优化sq…

嘉绩咨询:搭建品牌招商桥梁,提供卓越讲师与会议服务

当下,品牌成功的关键在于强大的渠道支撑和高效的招商能力,在这一背景下,嘉绩咨询,这一专注于渠道招商全案系统孵化的知名平台型企业,今日宣布,将进一步加强其在品牌招商桥梁搭建上的服务功能,通…

[java] 23种设计模式之桥接模式

一、什么是桥接模式 桥接(Bridge)模式属于结构型设计模式。通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。 二、适用场景 当一…

不知道吧,腾讯云轻量应用服务器使用有一些限制!

腾讯云轻量应用服务器相对于云服务器CVM是有一些限制的,比如轻量服务器不支持更换内网IP地址,不支持自定义私有网络VPC,内网连通性方面也有限制,轻量不支持CPU内存、带宽或系统盘单独升级,只能整个套餐整体升级&#x…

Intellij IDEA 中 git 操作的快捷键

1.添加新建的文件 即add 操作 shift alt a 2.提交操作 即 commit操作 ctrl k 在窗口中可以用feature来声明此次更新的内容 3.提交操作 即push操作 ctrl shift k 4.拉去远程分支操作 即pull操作 ctrl t

一个爬虫自动化数据采集的故事~

目录 一、原文二、故事前半段背景内容三、正经的讲点DrissionPage知识四、故事的收尾 一、原文 原文来自一个爬虫自动化数据采集的故事~ , 建议点击链接看文章末尾的视频笔者不擅长自动化,一个小小故事分享给大家,仅个人观点 二、故事前半段背景内容 …

【C语言】linux内核tcp_write_xmit和tcp_write_queue_purge

tcp_write_xmit 一、讲解 这个函数 tcp_write_xmit 是Linux内核TCP协议栈中的一部分,其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部,确保只要远程窗口有空间,就可以发送数据。 下面是对该函数的一些主要逻辑的中…

python爬虫(4)

#前期先说明一下为啥爬虫需要学习数组的存储和处理,只是说在你后期接触到最简单的爬虫后有一个地方可以存放你的数据# 下面为大家带来一个我在做excel表整理时的代码以及上次代码的结果 上次代码的结果: 新的代码: import numpy as np im…

委员建议进一步扩大香港与内地金融市场互联互通发展

在我们共同追寻金融发展的星辰大海之际,我怀着无比激动的心情,向诸位委员提议进一步扩大香港与内地金融市场互联互通发展。这个议题犹如一颗璀璨的明珠,闪耀着诱人的光芒,吸引着我们为之奋斗。让我们共同探讨这一话题,…

如何变得心智成熟?我推荐你读这5本书

一个人若总是在底层混,说明他的脑子确实不怎么样,一群底层的人聚在一起就更完蛋。 变化是常态,成长是选择。无法否定过去相信的东西,是你最大的障碍。 今天,为大家推荐一份“心智书单”。 01 《打开心智》 李睿秋提…

【产品应用】一体化步进伺服电机在绿光激光打标机中的应用

随着科技的不断发展,激光打标技术已经成为现代工业生产中不可或缺的一部分。绿光激光打标机以其高精度、高效率、高可靠性等特点,广泛应用于各种材料的标记与打标。而在绿光激光打标机中,一体化步进电机的应用则为其带来了更高的性能与更稳定…