赞
踩
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校验)
——进入游戏
——既不用像使用lua方案中需要多学习一门语言,也不用像ILRuntime方案中使用Mono虚拟机,效率低
——正因为HybridCLR是原生runtime级别实现,热更新部分的类型与主工程AOT部分类型是完全等价并且无缝统一的。可以随意调用、继承、反射、多线程,不需要生成代码或者写适配器
工具安装
——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的错误
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。