C#hybridCLR热更新方案初探

news2024/9/29 13:21:02

前言

暂时处于初步研究状态,目前的框架使用还是尚少,本篇文章旨在同步给大家大概的使用流程和使用心得,在初步建立新项目时可以适当考虑。

介绍

热更新

与强制更新相对应,移动平台上App的可执行程序没有发生变化,仅需要更新游戏资产就可以实现新版本的分发,这种更新称之为热更新。由于不需要经过App商店审核,这种更新内容可以非常快速地分发给玩家。玩家也不需要重新下载App全量包,仅需要下载变动的资产部分即可正常进行游戏,相对而言减小了玩家流失的风险。

为什么会诞生第三方热更新方案,而非系统原生支持

IOS上的反射是部分支持,支持使用反射读取源代码,但不支持使用反射动态生成可执行代码。总而言之,IOS不支持以动态方式创建新的方法和类型。资源热更新采用我们目前的assetbundle是没有任何问题的,如果我们把部分逻辑提取至一个单独的代码库工程中,打包为DLL,再用DLL打包成AB包,用户下载完这个AB包后动态加载DLL文件,按理说是可行的,但是ios不支持动态运行代码,所以是没办法的。

第三方热更新方案

目前市面上主流的,我了解到的热更新方案有lua、ILRunTime、HybridCLR。

从unity到底层二进制代码的流程主要是Unity->.net字节码->il2cpp->C++静态代码->二进制代码

lua分xlua和ulua。xlua是腾讯写的lua热更新框架,目前项目在使用,主要逻辑是自己会生成一个虚拟机管理lua数据,在初始阶段用dostring或者loader的方式加载lua,中期通过挂载luabehaviour的方式和lua侧的luatable进行交流,中间有关unity的obj生成wrap文件让lua侧能get、set数据。具体参考前文Lua与C#交互初析-CSDN博客。

ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速、方便且可靠的IL运行环境,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新。由于unity可以解释执行.net字节码,所以ilruntime采取C#侧的一个虚拟环境来对C#代码作.net字节码更新,交给unity。

HybridCLR改写了il2cpp模块,给il2cpp新增了原生的interpreter模块,使其能够通过Assembly.Load的方式动态加载dll。没有数据跨域的问题。

df1e45504d8d4588a3f8d298038911a1.png

简要概括,为了能让游戏运行过程中动态更新代码,有两种流派:lua和ILRuntime在unity内部实现一个虚拟机,用虚拟机解释执行.net代码,在这里面进行代码热更;hybridCLR改写了更底层的il2cpp模块,我们在运行时只需要确保更新到最新的.dll模块,即可完成代码更新。

HybridCLR操作流程

AssetBundle

在说明代码热更新之前,首先需要研究AB包的热更新流程。打包方式采用BuildPipeline.BuildAssetBundles实现,在运行过程中调用AB包资源时采用AssetBundle.LoadFromFile/AssetBundle.LoadFromMemory 和 AssetBundle.LoadAsset实现。

下载

为了模拟热更新,客户端本地需要在网络上请求到最新的资源并且下载到本地,再用新下载的文件加载进游戏中才算真正实现。于是服务器端我临时搭建了一个python的http服务器用来处理简单的上传下载功能。客户端采用项目里的下载流程。

HybridCLR框架使用

根据官方文档的流程做,新建一个2021稳定版本的unity工程,在内部安装HybridCLR package并初始化HybridCLR,并对playerSettings做出一些改动(比如关闭增量式GC(Use Incremental GC) 选项、Scripting Backend 切换为 il2cpp等操作)。具体流程参照官方文档。

在进程刚启动时就更新主链接库Assembly-CSharp.dll,参考以下代码,时间类似于项目组目前的startup更新,只不过这里更新的是dll文件,组内更新的是assetbundle然后解包注入lua bytes。

1a3496dea7b54bf1adc15a358a7e2104.png

30d5247c09834e14832e0d779a5095b2.png

553ec0647f334b12877f7fa3bd5561a0.png

load完Assembly-CSharp.dll就直接开始走内部加载方式了,直接在热更新的代码片段里驱动调用更新代码把其他资源更新过来即可。

acc68c8db8d44064afdac94944453292.png

最后就可以开展其他工作了,比如在这些资源上增删改查代码。

更新前:

a505c7f19f6847a8bce313d6500b7cca.png

7552543b5bc44ed4867e590b2d1530d5.png

更新后:

4dce3a9035234d2ebf451c32bd7ffe19.png

aabdb465e81b4ec681b7908763d2a8d1.png

如果后期要增加外部dll(大部分时候用Assembly-CSharp.dll就已经可以了),也没啥问题,直接在热更新C#代码里更新热更资源就行。比如现在我增加一个新的dll,只需要导入进来并且设置project的HybridCLR settings即可(类似assetbundle kit设置)。

dcafe7cebca44d8fb754c79be282070a.png

导入ClassLibrary1.dll后改写上述的hotupdatemain即可。

013366bcd61c4f68a8b3b00fbc9d64b8.png

04bdf8725c1343929f3871378f2ca533.png

这个时候不用换包,还是用之前的那个包,依然可以达到热更新效果。

8bf0a14848524afd9b71480f5219e5f8.png

 

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

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

相关文章

免费畅享,打破写作瓶颈:星火写作助手覆盖全面,助你轻松创作

啰嗦几句 最近年终岁末,公司的各种文案各种总结,写得人是头晕脑胀,所以好多小伙伴最近在求智能写作的软件,最好是ChatGPT。 ChatGPT是国外产品,在国内并不能访问。而就智能写作来说,我们何必舍近求远呢&am…

flutter极光推送配置厂商通道(华为)笔记--进行中

一、基础集成按照下面官方文档进行 厂商通道相关参数申请教程 集成厂商 集成指南 官方文档:厂商通道回执配置指南 注意:不同厂商对app上架的要求不同,华为、荣耀 对app上架没有硬性要求 遇到问题 1、引入apply plugin: com.huawei.agconn…

2023-2024年重庆职业院校技能大赛“信息安全管理与评估”比赛样题

2023 年重庆职业院校技能大赛(高等职业教育) “信息安全管理与评估”样题任务书 第一阶段:任务 1 网络平台搭建(50 分)任务 2 网络安全设备配置与防护(250 分) 第二阶段:第一部分 网…

GoZero微服务个人探究之路(九)api文件编写总结

参考来源go-zero官方文档https://go-zero.dev/docs/tutorials 前言 go-zero是目前star最多的go语言微服务框架,api 是 go-zero特殊的语言,类型文件,go-zero自带的goctl可以通过.api文件生成http服务代码 api文件内容编写 不可使用关键字 …

Chrome 插件调试

http://blog.haoji.me/chrome-plugin-develop.html#te-bie-zhu-yi-background-de-bao-cuo 手把手:Chrome浏览器开发系列(四):调试我们开发的插件 - 掘金

iOS推送通知

文章目录 一、推送通知的介绍1. 简介2. 通知的分类 二、本地通知1. 本地通知的介绍2. 实现本地通知3. 监听本地通知的点击 三、远程通知1. 什么是远程通知2. 为什么需要远程通知3. 远程通知的原理4. 如何做远程通知5. 远程通知证书配置6. 获取远程推送要用的 DeviceToken7. 测试…

技术解读 | KunDB助力头部金融机构关键系统的Oracle国产替代

星环科技自主研发的分布式交易型数据库KunDB助力头部金融机构实现了关键系统的Oracle国产化替代。 通过可视化迁移工具完成了对象与数据的平滑迁移,将原先两套Oracle系统(一套Oracle单机系统,一套Oracle RAC系统)统一迁移到一套K…

运动戴什么耳机好?怎样选运动耳机?2024年运动蓝牙耳机推荐

​运动耳机作为运动人士的得力助手,不仅要求佩戴舒适,还需要在音质表现、防水性能、通话质量等方面有出色表现。下面我为大家推荐几款性能全面的运动耳机,希望能满足不同需求的运动爱好者,来看看吧。 1.南卡开放式耳机&#xff08…

02-TiDB部署本地测试集群

基于v7.5版本 1、下载并安装 TiUP curl --proto https --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh 下载后路径/root/.tiup,已自动将环境变量写入文件中,需要手动执行source source /root/.bashrc 2、在当前 session 执行以下命令…

深入理解3D扩散生成式模型

Stable Dreamfusion 上的这个存储库启发了这个博客。 我认为 3D 扩散和 3D 生成似乎是每个人心中的下一件大事。 Stability AI 开始招聘才华横溢的 3D AI 工程师,谷歌和学术界每天似乎都在进行令人印象深刻的即时 3D 模型生成器研究。 然而,虽然我对这些…

GuitarPro和Earmaster那个适合新手

许久没发文了,最近在网上刷到了一位音乐UP主从容Free,他把自己对GuitarPro和Earmaster这2款软件的使用感受进行了详细分享,还没看过的朋友可以戳下面的链接跳转到小破站看完整的: 我不允许还有人不知道这个学吉他的神器&#xff…

专业140+总分420+复旦大学957信号与系统考研经验复旦电子信息与通信

今年专业957信号与系统140,数二140,总分420,顺利上岸复旦大学,回顾这一年的复习,有起有落,也有过犹豫和放弃,好在都坚持下来了,希望大家考研复习要不忘初心,困难肯定是很…

深度学习(5)--Keras实战

目录 一.Keras基础概念 二.如何跑通Keras项目 2.1.在cmd上跑通 2.2.在PyCharm上跑通 一.Keras基础概念 Keras是深度学习中的一个神经网络框架,是一个高级神经网络API,用Python编写,可以在TensorFlow,CNTK或Theano之上运行。 …

【labVIEW】学习记录

【labVIEW】学习记录 一、简介二、安装及激活三、使用 回到目录 一、简介 labVIEW(Laboratory Virtual Instrument Engineering Workbench)是一款由美国国家仪器公司(National Instruments)开发的可视化编程环境和开发平台。LabV…

Windows在局域网内开启共享文件夹

局域网内多台电脑开启共享文件夹可以提高使用舒适度,而共享文件夹的设置方式也非常简单。 1、开启网络共享 1.1 确定网络类型:公用or专用 首先我们需要确定自己的网络类型,首先从网络和共享中心可以看到我的电脑连接了一个wifi&#xff0c…

snmp网管服务MIB Browser使用

MIB Browser 软件打开显示界面,首先需要配置地址、端口号、团体名、snmp版本点击Advanced,弹出配置界面 配置成功后双击走测列表信息就可以查看交换机端口状态、版本号等信息; 例如:我的交换机8号端口是正常,其他端口是…

基于FPGA的高效除法器

FPGA可以通过除号直接实现除法,但是当除数或被除数位宽较大时,计算会变得缓慢,导致时序约束不能通过。此时可以通过在除法IP中加入流水线来提高最大时钟频率,这种方式提高时钟频率也很有限。如果还不能达到要求,就只能…

牛客刷题之列表

文章目录 生成数字列表列表的长度添加列表元素append() 列表尾添加insert(index,elem) 在任意位置插入 删除列表元素pop(index) 删除下标为index 的元素并返回remove(x) 删除指定元素 生成数字列表 方法一(普通方法) num input() newnum num.split() a…

Flutter中实现中国省份地图

效果展示(这里只展示局部,完全展示违规): 可以点击省份改变颜色,更多功能可以自行拓展。 注:非完整中国地图!!! 本文用于记录在Flutter项目中安卓端实现中国地图,因为实现过程是通过…

vue项目中debugger不生效问题解决

Vue中使用debugger在chrome谷歌浏览器中失效问题(已解决)_vue debugger不生效-CSDN博客 卡了半天,最后解决了