C#hybridCLR热更新方案初探

前言

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

介绍

热更新

与强制更新相对应,移动平台上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.rhkb.cn/news/245190.html

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

相关文章

微服务环境搭建:docker+nacos单机

nacos需要连接mysql,持久化相关配置。 1. 部署好mysql后,新建nacos数据库然后初始化nacos脚本 -- -------------------------------------------------------- -- 主机: 192.168.150.101 -- 服务器版本: …

【开源】基于JAVA的假日旅社管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

143基于matlab的2D平面桁架有限元分析

基于matlab的2D平面桁架有限元分析,可以改变材料参数,输出平面结构外形,各桁架应力,位移及作用力。可查看节点力,程序已调通,可直接运行。 143 matlab 平面桁架 有限元分析 桁架应力 (xiaohongshu.com)

Java日期和时间学习记录2

1、Java的LocalDate类当前时间往未来几天和过去时间几天 import java.time.LocalDate;public class Main {public static void main(String[] args) {// 获取当前日期LocalDate currentDate LocalDate.now();System.out.println("当前日期:" currentDa…

边裁边招,2024大厂往哪“卷”?

裁员只是大厂踌躇、转型的缩影,无论是林平还是背后的公司、行业,都亟需给未来一个确定的答案。 从2021年冬天开始,大厂裁员的消息有如“击鼓传花”般,不断冲击着圈内外网友们的神经,那可能是“裁员”这个话题自互联网…

大语言模型无代码构建知识图谱概述

2023年3月15日,ChatGPT4.0的横空出世,将人们对大语言模型的关注推到了风口浪尖。由于其在智能问答、翻译以及文本生成等工作任务上的卓越表现,业界一度出现了不再需要发展知识图谱相关技术的观点,知识图谱相关概念严重受挫。无可置…

EasyDarwin计划新增将各种流协议(RTSP、RTMP、HTTP、TCP、UDP)、文件转推RTMP到其他视频直播平台,支持转码H.264、文件直播推送

之前我们尝试做过EasyRTSPLive(将RTSP流转推RTMP)和EasyRTMPLive(将各种RTSP/RTMP/HTTP/UDP流转推RTMP,这两个服务在市场上都得到了比较多的好评,其中: 1、EasyRTSPLive用的是EasyRTSPClient取流&#xff…

接口文档swagger2的使用

Spring-接口文档swagger2 1、swagger/knife4j 接口文档配置 ​ knife4j是swagger的增强版本&#xff0c;更加的小巧、轻量&#xff0c;功能也是更加的完善&#xff0c;UI也更加的清晰&#xff1b;可以从swagger到knife4j无缝切换。 1.1 引入相关依赖 <!--接口文档的开发:…

2023.1.21 关于 Redis 主从复制详解

目录 引言 单点问题 分布式系统 主从模式 配置 Redis 主从结构 断开主从关系 切换主从关系 补充知识点一 只读 网络延迟 拓扑结构 一主一从 一主多从 树形主从结构 主从复制的基本流程 数据同步 replicationid offset pzync 运行流程 具体流程 补充知识点二…

java steam 的使用

说steam 前看下kotlin的一个写法如果用java怎么写 fun main() {// 创建一个列表val fruits listOf("Apple", "Banana", "Cherry", "Date", "Elderberry")// 使用 Sequence 进行过滤和映射操作val uppercaseFruitLengths …

微认证 openEuler社区开源贡献实践

文章目录 1. 开源与开源社区2. openEuler 社区概述3.参与openEuler社区贡献4.openEuler软件包开发Linux软件管理——源码编译 1. 开源与开源社区 Richard Matthew Stallman&#xff0c;1983年9月推出GNU项目&#xff0c;并发起自由软件运动(free software movement或free/open…

探索设计模式的魅力:深入理解面向对象设计的深层原则与思维

如何同时提高一个软件系统的可维护性 和 可复用性是面向对象对象要解决的核心问题。 通过学习和应用设计模式&#xff0c;可以更加深入地理解面向对象的设计理念&#xff0c;从而帮助设计师改善自己的系统设计。但是&#xff0c;设计模式并不能够提供具有普遍性的设计指导原则。…

C语言王道练习题第七周两题

第一题 Description 输入一个学生的学号&#xff0c;姓名&#xff0c;性别&#xff0c;用结构体存储&#xff0c;通过 scanf 读取后&#xff0c;然后再 通过 printf 打印输出 Input 学号&#xff0c;姓名&#xff0c;性别&#xff0c;例如输入 101 xiongda m Output 输出…

MySQL的SQL分类与数据类型

MySQL是一款广泛使用的关系型数据库管理系统&#xff0c;开源、免费且跨平台&#xff0c;常用于存储、管理和检索结构化数据&#xff0c;并通过SQL语言支持高效的数据操作与管理。 文章目录 何为SQLSQL分类DDLDMLDCLTCLDQL MySQL的数据类型数值型日期型字符串型二进制型其他类型…

引领AI变革:边缘计算与自然语言处理结合的无尽可能

引言 讲到Ai&#xff0c;你第一时间会想到什么&#xff1f;是Chagpt和文心一言这样与人类交流自然的Ai生成式对话服务&#xff1f;还是根据关键字快速制图的Ai绘图&#xff1f;这些都是近年来人们所常知的Ai用途&#xff0c;我们今天来讲讲以自然语言处理为辅&#xff0c;在Ai赋…

我每天如何使用 ChatGPT

我们都清楚互联网的运作方式——充斥着各种“爆款观点”&#xff0c;极端分裂的意见&#xff0c;恶搞和无知现象屡见不鲜。 最近&#xff0c;大家对于人工智能&#xff08;AI&#xff09;特别是大语言模型&#xff08;LLMs&#xff09;和生成式 AI&#xff08;GenAI&#xff0…

Redis: Redis介绍

文章目录 一、redis介绍二、通用的命令三、数据结构1、字符串类型&#xff08;String&#xff09;&#xff08;1&#xff09;介绍&#xff08;2&#xff09;常用命令&#xff08;3&#xff09;数据结构 2、列表&#xff08;List&#xff09;&#xff08;1&#xff09;介绍&…

【数据结构】链表的分类和双向链表

本篇是基于上篇单链表所作&#xff0c;推荐与上篇配合阅读&#xff0c;效果更加 http://t.csdnimg.cn/UhXEj 1.链表的分类 链表的结构非常多样&#xff0c;以下情况组合起来就有8种&#xff08;2 x 2 x 2&#xff09;链表结构&#xff1a; 我们一般叫这个头为哨兵位 我们上回…

三星S24未破智能手机藩篱,AI Phone继续期待黑马

匆忙离开深圳机场的时候&#xff0c;《智物》遇到几位熟悉的老朋友。习惯了在中国市场边缘生存的&#xff0c;全球第一代智能手机企业三星公司&#xff0c;刚刚在此地录制完了新旗舰手机三星S24系列的发布会视频。 贵为全球第一大智能手机品牌的三星发布会居然不是直播。韩式套…

【嵌入式学习】C++QT-Day2-C++基础

笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度…