HybridCLR 热更新介绍

这篇具有很好参考价值的文章主要介绍了HybridCLR 热更新介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@HybridClr介绍

C# -> HybridCLR 热更新介绍

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

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

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

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

HybridCLR的基本运行原理

hclr,Unity,lua,unity,开发语言

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

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

hclr,Unity,lua,unity,开发语言

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

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官方的性能报告图
hclr,Unity,lua,unity,开发语言hclr,Unity,lua,unity,开发语言

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

1.在新增第三方库的时候,例如Dotween,AStart等相关第三方库,需要重新对AOTMetaAssemblyNames进行补充,重新出包。因为AOT的DLL列表好像是随着包出的。而且要记得扫描一下,要不然本身没补充到 出包也解决不了丢失引用的问题。
2.在对老项目子程序的管理:稍有不慎,就会导致引用混乱,可能跟自己对这块的理解程度不够,参考了第三方接入Hclr框架后对这块有一个概念:hclr,Unity,lua,unity,开发语言
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文章来源地址https://www.toymoban.com/news/detail-578849.html

到了这里,关于HybridCLR 热更新介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】热更新HybridCLR学习与实战(一)

    从事unity开发以来一直未真正系统的学习过热更新,现在业务上有需要,借此机会来深入学习一下,调研了几种现有比较火的热更新框架,对比了一下优劣,最终决定使用HybridCLR来做热更新,最终目的是要加入到我们已有的项目中,所以肯定要全面实现商业化,因此有同等需

    2024年02月03日
    浏览(40)
  • Unity 热更新 HybridCLR 对接到项目中

    Unity版本 2021.3.6f1 HybridCLR版本 2.2.0 1.1要注意两点: 1.Unity 要安装了Windows-IL2CPP 环境的,这个Unity官网有提供,根据自己Unity版本下载对应的环境即可。 2.il2cpp需要c++的环境库,一般情况不是C开发的,很容易缺失c++的开发环境,因此在打包时会出现 error: could not set up a toolchain

    2024年02月12日
    浏览(41)
  • Unity | YooAssetV2.1.0 + HybridCLR热更新

    目录 一、项目更改 二、使用YooAsset热更 1.资源配置 2.资源构建 3.将两个文件夹下的资源上传CDN服务器 4.修改代码 5.运行效果         本文记录利用YooAsset+HybridCLR来进行资源和dll的更新。YooAsset使用的是新版V2.1.0。相比于旧版,dll(原生文件)和资源要建两个package分别来进行bu

    2024年02月19日
    浏览(35)
  • Unity最新热更新框架 hybridclr_addressable

    GitHub:YMoonRiver/hybridclr_addressable: 开箱即用的商业游戏框架,集成了主流的开发工具。将主流的GameFramework修改,支持Addressable和AssetBundle,已完善打包工具和流程。 (github.com) # 新增GameFramework Addressables 开箱即用 # 新增循环列表 ### UnityGameFramework   **此框架参考:**    `GameFramework

    2024年02月03日
    浏览(44)
  • Unity之如何接入HybridCLR(代号wolong,原huatuo)热更新框架

    HybridCLR(代号wolong)是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案。 官方提供了完整的教程:HybridCLR快速上手 官方还提供了一个简易的小Demo,演示了如何使用HybridCLR实现热更新。hybridclr_trial 官方文档其实已经非常详细了,我写本文目的主要

    2024年02月12日
    浏览(39)
  • 【Unity3D热更新】Unity3D 零成本、高性能的C#的热更新框架:HybridCLR

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 相信只要做过热更新的小伙伴,都被热更新搞过心态吧。 我有一个小伙伴,本来是面向

    2024年01月16日
    浏览(49)
  • Unity Xlua热更新框架(五):Lua和UI管理

    :::info Lua存在两种加载器,一种默认加载器(env.DoString(\\\"require(‘test’)\\\"直接用了默认加载其),直接调用StreamingAssets中的脚本);一种是自定义加载器(env.AddLoader(Envpath)),优先于默认加载器(下文DoString就是从自定义加载器的路径读取的),并且当Lua代码执行require函数时,

    2024年02月06日
    浏览(50)
  • unity lua开发体系搭建

    在前面的文章里面我们已经介绍了怎么样在unity里面配置lua的开发环境,我们可以通过C#代码装载lua的脚本并执行相应的处理,这次我们一步步搭建下lua的开发体系。 1.基于c#体系所有的类都继承MonoBehaviour在这里lua环境下我们也需要创建一个类似于这个类的东西,我们叫这个类

    2024年02月07日
    浏览(54)
  • Unity—配置lua环境变量+VSCode 搭建 Lua 开发环境

    每日一句:保持须臾的浪漫,理想的喧嚣,平等的热情 链接:https://pan.baidu.com/s/14pAlOjhzz2_jmvpRZf9u6Q?pwd=hd4s 提取码:hd4s 此电脑——属性——系统——高级系统设置 ——环境变量 用户变量新建 (路径为安装包存放路径 ) 系统变量 点击Path ——编辑 添加,点击确定 按win+R键弹

    2024年01月23日
    浏览(43)
  • HybridCLR 热更新介绍

    @HybridClr介绍 以下讲简单阐述下个人理解的Hclr的相关知识,以及在使用中遇到的坑点. 为了方便下文的更好的理解,建议大家先简单过一下下文的一些名称和一些简单的知识点: CommonLanguageRuntime ,公共语言运行环境; Ahead Of Time (AOT) ,指运行前编译 - 静态编译环境; Just-in-t

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包