HybridCLR 热更新介绍

@HybridClr介绍

C# -> HybridCLR 热更新介绍

以下讲简单阐述下个人理解的Hclr的相关知识,以及在使用中遇到的坑点.

在使用HybridCLR 前的一些基本知识储备

为了方便下文的更好的理解,建议大家先简单过一下下文的一些名称和一些简单的知识点:

  1. CommonLanguageRuntime ,公共语言运行环境;
  2. Ahead Of Time (AOT),指运行前编译 -> 静态编译环境;
  3. Just-in-time(JIT),指即时编译(动态),边运行边编译;
  4. ILC2CPP,Unity提供的跨平台CLR的解决方案;

HybridCLR的基本运行原理

图解

简单的用一句话概括:
对Unity提供的原生IL2CPP的方案进行深度改造,讲它由纯AOT的运行方案改造为AOT+interpreter的混合运行模式进行。

其中,主要实现了以下功能:
1.实现了支持用原生加载DLL、解析DLL。
2.支持动态注册到HybridCLR的相关解释器。
3.支持补充相关元数据。
4.支持AOT泛型的机制
5.支持HotFIX AOT
6.支持Mono使用热更脚本
7.支持资源上挂载热更新脚本
等等

在这里插入图片描述

跟其他的热更方案本质区别

HybridCLR是原生的c#热更新方案。原始il2cpp相当于只有aot的mono,而HybridCLR则给il2cpp新增了原生的interpreter模块,使得il2cpp变成一个全功能的mono,原生(即通过System.Reflection.Assembly.Load)支持动态加载dll,从而支持ios等平台的热更新。其他热更新方案则是新增了一个独立于il2cpp的第三方vm。

正因为HybridCLR是原生runtime级别实现,热更新部分的类型与主工程AOT部分类型是完全等价并且无缝统一的。可以随意调用、继承、反射、多线程,不需要生成代码或者写适配器。

其他热更新方案则是独立vm,与il2cpp的关系本质上相当于mono嵌lua的关系。因此类型系统不统一,为了让热更新类型能够继承AOT部分类型,需要写适配器,并且解释器中的类型不能为主工程的类型系统所识别。

Lua(XLua、ToLua): 通过Lua虚拟机作为解释层,对游戏中启动一个Lua虚拟机,通过编写对应的Lua业务逻辑脚本,和少量的C#框架层代码(映射MonoAPI,绑定界面等)实现的整套热更新机制。因为本身Lua脚本语言它不属于Unity层,相当于一个第三方可读写的文本.只不过通过Lua虚拟机解释了。所以对于Unity本身而言,只是去下载了类Txt的东西而已。

ILRuntime:本质通过Mono.Cecil 函数读取对于的DLL字节码相关信息,通过IL内置的虚拟机来反解对应的字节码信息,从而得到原始DLL中的代码。这里缺点最大的地方是他无法直接使用Mono的API,也无法在资源上挂热更脚本.

从上述对应的热更方案实现原理来看,不难发现,无论是Lua也好、ILRuntime也好、HybridCLR也好,都是需要一层对应的虚拟机去解析自己的业务逻辑。但是Lua、IL因为并不是在原生层面上进行的拓展,没法直接使用到Mono层相关的元数据,导致在接入相关热更新方案的时候还是会导致对原有工程的开发流程有一个很大的改变和一定的学习成本。

HCLR官方的性能报告图
在这里插入图片描述在这里插入图片描述

在实际接入过程中遇到的坑

1.在新增第三方库的时候,例如Dotween,AStart等相关第三方库,需要重新对AOTMetaAssemblyNames进行补充,重新出包。因为AOT的DLL列表好像是随着包出的。而且要记得扫描一下,要不然本身没补充到 出包也解决不了丢失引用的问题。
2.在对老项目子程序的管理:稍有不慎,就会导致引用混乱,可能跟自己对这块的理解程度不够,参考了第三方接入Hclr框架后对这块有一个概念:在这里插入图片描述
3.如果资源上挂载了热更域的脚本,通过GameObject.GetComponent(string name) 是无法获取到组件的。这个好像是已知的Bug。 建议是使用 GameObject.GetComponent()
4.打包工作流相应的改动,需要参照HCLR调整打包相关的工具流程,对应的热更DLL不放进包内。
4.1需要生成对应的DLL文件和裁剪后的AOTDLL。
4.2需要使用HCLR提供的工具编译热更新DLL。
4.3IOS平台还需特殊处理下:对应文档HCLR IOS 特殊处理

以下为基于接入HCLR的第三方仓库推荐:Deer-Wolong

HCLR官方仓库:HybridCLR

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

tkinter文件对话框

文章目录 文件对话框文件对象文件类型其他参数 tkinter系列: GUI初步💎布局💎绑定变量💎绑定事件💎消息框扫雷小游戏💎强行表白神器 文件对话框 filedialog提供了多种与文件交互相关的对话框&#xff0c…

bluestore

BlueStore BlueStore 架构及原理分析 Ceph 底层存储引擎经过了数次变迁,目前最常用的是 BlueStore,在 Jewel 版本中引入,用来取代 FileStore。与 FileStore 相比,Bluesore 越过本地文件系统,直接操控裸盘设备&#x…

Bootstrap系列之颜色(Colors)

文章の目录 1、字体颜色2、背景颜色3、背景渐变写在最后 通过少量的颜色类来传达颜色的含义。还包括对具有悬停状态的链接样式的支持。 处理专一性 有时由于另一个选择器的专一性而不能应用上下文类。在某些情况下&#xff0c;一个足够的解决方法是用类将元素内容包装在<div…

Bluethooth

阅读时长10分钟 蓝牙技术是一种近距离无线连接技术。能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。 历史&#xff1a;蓝牙技术是世界著名的 5 家大公司一爱立信(Ericsson)、诺基亚(Nokia)、东芝(Toshiba)、国际商用机器公司(IBM)和英…

NewBlue Titler Pro 7不能预览 预览黑屏

问题描述 最近在剪辑视频 使用“NewBlue Titler Pro 7 Ultimate 7.4.201109”和谐版增加字幕时&#xff0c;出现字幕刚开始可以预览&#xff0c;动几下鼠标预览窗口卡死&#xff0c;随后黑屏。 解决方式 折腾之后发现用的版本不对&#xff0c;更换为下面的版本后可以正常使用…

华为od统一考试B卷【九宫格按键输入法】Python 实现

所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录 题目 九宫格按键输入,判断输出,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入”/…

华为od统一考试B卷【九宫格按键输入法】Java 实现

所有题目均有五种语言实现。C实现目录、C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录 题目 九宫格按键输入,判断输出,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入”/…

2022华为机试真题 C语言 实现【九宫格按键输入法】

九宫格按键输入,判断输出,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入”/”或者其他字符,则循环中断。 要求输入一串按键,输出屏幕显示。 输入描述: 输入范围为数字 0~9 和字符’#’、…

谷歌键盘切换26键与九宫格中文输入法

今天不小心把手输入法改成了九宫格&#xff0c;很不习惯&#xff0c;在设置里面找了很久也没找到&#xff0c;百度也没有找到答案。 最终偶然发现解决方案。 长按【中】出现如下界面&#xff0c;即可切换26键与九宫格。

Python之九宫格输入

文章目录 前言一、问题描述二、问题解决 前言 九宫格输入是一款手机平台的必备利器。假设有九宫格输入法键盘布局如下&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬…

九宫格按键输入c++

假设有九宫格输入法键盘布局如下&#xff1a; [ 1,.?! ] [ 2ABC ] [ 3DEF ] [ 4GHI ] [ 5JKL ] [ 6MNO ] [ 7PQRS ] [ 8TUV ] [ 9WXYZ ] [ 0空 ] 注意&#xff1a;中括号[ ]仅为了表示键盘的分隔&#xff0c;不是输入字符。 每个中括号中&#xff0c;位于首位的数字字符即是…

centos7部署openldap开启memberof并接入jumpserver

文章目录 前言1.yum安装openldap2.配置密码3.导入配置4.定义域5.配置memberof6.配置base dn7.安装phpldapadmin管理8.调整httpd的配置9.调整php的配置10.登陆php管理页面11.同步旧ldapsever用户数据(可省略)12.客户端配置13.对接jumpserver 前言 介绍如何在centos7上部署openl…

Unity Shader特效:人物模型动态流动光特效

本文写于2017-6-6&#xff0c;转载请注明 以下为正文 ………………………………………………………………………………………………………………………………………………………… 先上效果图&#xff1a; Shader界面图&#xff1a; 因为特效师的攻击特效做得过为酷炫&#…

python实现两个图片的叠加融合

python通过PIL将两个图片叠加融合 我想到将一个图片去除背景将其放到另一张图片上以此实现融合。 1**. 打开想要融合的图片** file Image.open(6.png) verse 9.png我选取的两个图片 2**. 将附在上面的图片的背景进行透明化** verse transPNG(verse)# 图片背景透明化 …

壁纸网站研究:强大到没朋友的壁纸网站整理(动漫/二次元/宅男/风景/真人)

1、wallhaven 域名&#xff1a;https://wallhaven.cc 介绍&#xff1a;一个强大的壁纸网站&#xff0c;包含人物、动漫、风景&#xff0c;同时有一些老司机内容&#xff0c;需要选择NSFW&#xff0c;但需要登录才能观看&#xff0c;隐藏功能。但是海外网站&#xff0c;国内网…

java 人物头像识别

一、功能描述&#xff1a; 人物头像识别&#xff0c;识别图片中的是否含有人物头像。 二、准备工作&#xff1a; 创建需要识别的图片目录 &#xff0c;如F:/img&#xff0c;链接中files\img中为示例图片。导入所需jar包&#xff0c;见files\jar。新建依赖文件haarcascade_fro…

日常问题——使用Java转将long类型为date类型,日期是1970年

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 long类型的日期为&#xff1a;1646718195 装换为date类型&#xff1a; Date date new Dat…

google浏览器截取长图

方法一&#xff1a; 首先F12选中手机模式 然后点击右上角 选择capture full size screenshot 或者ctrl shift p 方法二&#xff1a; 按F12打开调试页面&#xff0c;然后按下ctrlshiftp&#xff0c;输入命令Capture full size screenshot&#xff0c;敲回车&#xff0c;浏览…

edge便捷截取长图

edge便捷截取长图 右上角 三点 ——》网页捕获 ——》捕获整页 简简单单 方便食用~