• Unity中实现HybridCLR热更新


    一:前言

    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的错误

  • 相关阅读:
    Euler Integration
    C语言-扫雷游戏的实现
    Kafka KRaft模式探索
    PostMan接口测试教程
    maven中clean,compile,test,package,install分别有什么作用
    使用git上传代码至gitee入门(1)
    数据结构-难点突破(线索化二叉树与遍历 C++中序线索化二叉树,前序线索二叉树,后序线索二叉树)
    java-websocket自定义springboot 作为ws客户端
    一篇五分生信临床模型预测文章代码复现——Figure1 差异表达基因及预后基因筛选——下载数据(一)
    OpenSSF的开源软件风险评估工具:Scorecards
  • 原文地址:https://blog.csdn.net/LLLLL__/article/details/132765936