当前位置:   article > 正文

Unity中实现HybridCLR热更新_unity 华佗

unity 华佗

一:前言

HybridCLR又称作huatuo(华佗)、wolong(卧龙)热更方案,底层是C++编写的,是一种热更新方案,与Lua、ILRuntime等都是不同的热更方案
HybridCLR扩充了il2cpp的代码,使它由纯AOT runtime变成AOT+Interpreter混合runtime,进而支持动态加载assembly,实现热更新

HybridCLR官网

HybridCLR热更原理
IOS不允许JIT的方式编译,因为JIT是需要在运行时动态将IL代码编译为机器码并将其保存在内存中,但是
IOS是不允许执行动态生成的机器码(运行时分配的内存不允许执行),所以相当于变相的封锁了JIT这种编译方式
而HybridCLR是实现了自己的一套解释器去解释执行,解释执行不会在运行时生成额外的本地机器码,而是运行时直接逐行分析并编译成机器码执行,内存中不会保留,因此不受JIT编译的限制


二:什么是热更新

热更新是指当游戏出现bug,或者需要修改,增加某个功能的时候,我们不需要重新下载安装包,就可以更新游戏内容
当游戏上线后,遇见bug或者需要更新内容,一般有两种做法
第一种:重新打包上传一个新的安装包到应用商店(需要审核,费时间),然后让玩家下载新的客户端安装包(需要重新下载,费流量,会减少留存率)
第二种:在游戏内更新,游戏启动时去下载需要更新的补丁包或资源
第一种我们一般在大版本更新时使用,称为游戏整包更新,第二种称为热更新


三:热更新流程

——发现bug并修改bug
——资源打AB包上传,代码使用热更方案上传
——玩家启动游戏检测是否需要更新
——下载补丁包
——检测是否更新成功(例如通过MD5校验)
——进入游戏


四:HybridCLR的优点

——既不用像使用lua方案中需要多学习一门语言,也不用像ILRuntime方案中使用Mono虚拟机,效率低
——正因为HybridCLR是原生runtime级别实现,热更新部分的类型与主工程AOT部分类型是完全等价并且无缝统一的。可以随意调用、继承、反射、多线程,不需要生成代码或者写适配器


五:工具安装和配置HybridCLR环境

工具安装
——Unity版本在2020以上
——Visual Studio必须安装Windows Build Support(IL2CPP)或Mac Build Support(IL2CPP),Mac则需要安装Xcode
——Visual Studio必须在2019版本以上
——Visual Studio必须安装Unity的游戏开发使用c++的游戏开发组件

配置HybridCLR环境
——从Package中安装com.code-philosophy.hybridclr包
https://gitee.com/focus-creative-games/hybridclr_unity.git

https://github.com/focus-creative-games/hybridclr_unity.git
——菜单栏选择HybridCLR—Installer,安装成功后会在控制台打印成功日志
——PlayerSetting—Scripting Backend选择为IL2CPP
——PlayerSetting—Api Compatability Level选择为Net 4.x或.Net Framework
——PlayerSetting—Use Incremental GC选择为不勾选(自v4.0.0起已经支持增量式GC, 但处于beta版本)


六:热更实现

——编写代码,拆分程序集(AOT程序集和热更程序集)
热更的程序集不能被非热更程序集所引用

——配置程序集
点击菜单HybridCLR/Settings打开配置界面,将热更的程序集添加到hotUpdateAssemblyDefinitions或hotUpdateAssemblies中(hotUpdateAssemblies不加dll后缀),
需要注意hotUpdateAssemblyDefinitions和hotUpdateAssemblies两个列表是等价的,不要重复添加


——运行菜单HybridCLR/Generate/All生成热更的dll和AOT的dll以及一些桥接函数,
{project}/HybridCLRData/HotUpdateDlls/StandaloneWindows64目录下的热更dll复制到Assets/StreamingAssets/HotUpdate.dll.bytes
(复制后的dll要加.bytes后缀)


——修改热更代码后。运行菜单命令HybridCLR/CompileDll/ActiveBulidTarget重新编译热更新dll
{project}/HybridCLRData/HotUpdateDlls/StandaloneWindows64目录下的热更dll复制为刚才的打包输出目录的XXX_Data/StreamingAssets/HotUpdate.dll.bytes,重新运行程序


七:注意事项

——热更的程序集不能被非热更程序集所引用
——由于Unity资源管理系统的限制,挂载热更新脚本的资源(场景或prefab)必须打包成ab包,在实例化资源前先加载热更新dll即可,如果不打成ab包会发生scripting missing的错误

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/161457
推荐阅读
相关标签
  

闽ICP备14008679号