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

  • 相关阅读:
    Python_Nox_yield的用法
    Java 面试题集锦,横扫金九银十。
    网络安全(黑客)——自学2024
    opencv 缩小放大用哪种插值更好??
    STM32物联网基于ZigBee智能家居控制系统
    微信小程序 java高校某学院通知与文件分享系统Android app
    (七)Alian 的 Spring Cloud Config 配置中心(客户端)
    简单的用Python实现一下,采集某牙视频,多个视频翻页下载
    vue2点击左侧的树节点(el-tree)定位到对应右侧树形表格(el-table)的位置,树形表格懒加载
    Quartz .Net 的简单使用
  • 原文地址:https://blog.csdn.net/LLLLL__/article/details/132765936