1 Star 0 Fork 89

dq.xu / hybridclr

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

HybridCLR

license

HybridCLR是一个特性完整、零成本、高性能、低内存近乎完美的Unity全平台原生c#热更方案。

HybridCLR扩充了il2cpp的代码,使它由纯AOT runtime变成‘AOT+Interpreter’ 混合runtime,进而原生支持动态加载assembly,使得基于il2cpp backend打包的游戏不仅能在Android平台,也能在IOS、Consoles等限制了JIT的平台上高效地以AOT+interpreter混合模式执行。从底层彻底支持了热更新。

HybridCLR开创性地实现了 differential hybrid dll 技术====。即可以对AOT dll任意增删改,HybridCLR会智能地让变化或者新增的类和函数以interpreter模式运行,但未改动的类和函数以AOT方式运行,让热更新的游戏逻辑的运行性能基本达到原生AOT的水平。

特性

  • 特性完整。 近乎完整实现了ECMA-335规范,除了 下文中"限制和注意事项" 之外的特性都支持。
  • 零学习和使用成本。 HybridCLR将纯AOT runtime增强为完整的runtime,使得热更新代码与AOT代码无缝工作。脚本类与AOT类在同一个运行时内,可以随意写继承、反射、多线程(volatile、ThreadStatic、Task、async)之类的代码。不需要额外写任何特殊代码、没有代码生成,也没有什么特殊限制。
  • 执行高效。实现了一个极其高效的寄存器解释器,所有指标都大幅优于其他热更新方案。性能测试报告
  • 内存高效。 热更新脚本中定义的类跟普通c#类占用一样的内存空间,远优于其他热更新方案。内存占用报告
  • 原生支持hotfix修复AOT部分代码。几乎不增加任何开发和运行开销。
  • 开创性地实现了 differential hybrid dll 技术。即可以将某个热更新dll先AOT形式打包,后面可以对该dll任意增删改,HybridCLR会智能地让变化或者新增的类和函数以interpreter模式运行,但未改动的类和函数以AOT方式运行。这意味着热更新的游戏逻辑的运行性能将接近原生AOT的水平。

工作原理

HybridCLR从mono的hybrid mode execution技术中得到启发,为unity的il2cpp之类的AOT runtime额外提供了interpreter模块,将它们由纯AOT运行时改造为"AOT + Interpreter"混合运行方式。

icon

更具体地说,HybridCLR做了以下几点工作:

  • 实现了一个高效的元数据(dll)解析库
  • 改造了元数据管理模块,实现了元数据的动态注册
  • 实现了一个IL指令集到自定义的寄存器指令集的compiler
  • 实现了一个高效的寄存器解释器
  • 额外提供大量的instinct函数,提升解释器性能
  • 提供hotfix AOT的支持

与其他流行的c#热更新方案的区别

本质比较

HybridCLR是原生的c#热更新方案。通俗地说,il2cpp相当于mono的aot模块,HybridCLR相当于mono的interpreter模块,两者合一成为完整mono。HybridCLR使得il2cpp变成一个全功能的runtime,原生(即通过System.Reflection.Assembly.Load)支持动态加载dll,从而支持ios平台的热更新。

正因为HybridCLR是原生runtime级别实现,热更新部分的类型与主工程AOT部分类型是完全等价并且无缝统一的。可以随意调用、继承、反射、多线程,不需要生成代码或者写适配器。

其他热更新方案则是独立vm,与il2cpp的关系本质上相当于mono中嵌入lua的关系。因此类型系统不统一,为了让热更新类型能够继承AOT部分类型,需要写适配器,并且解释器中的类型不能为主工程的类型系统所识别。特性不完整、开发麻烦、运行效率低下。

实际使用体验或者特性比较

  • HybridCLR学习和使用成本几乎为零。HybridCLR让il2cpp变成全功能的runtime,学习和使用成本几乎为零,几乎零侵入性。而其他方案则有大量的坑和需要规避的规则,学习和使用成本,需要对原项目作大量改造。
  • HybridCLR可以使用所有c#的特性。而其他方案往往有大量的限制。
  • HybridCLR中可以直接支持使用和继承主工程中的类型。其他方案要写适配器或者生成代码。
  • HybridCLR中热更新部分元数据与AOT元数据无缝统一。像反射代码能够正常工作的,AOT部分也可以通过标准Reflection接口创建出热更新对象。其他方案做不到。
  • HybridCLR对多线程支持良好。像多线程、ThreadStatic、async等等特性都是HybridCLR直接支持,其他方案除了async特性外均难以支持。
  • HybridCLR中Unity工作流与原生几乎完全相同。HybridCLR中热更新MonoBehaviour可以直接挂载在热更新资源上,并且正确工作。其他方案不行。
  • HybridCLR兼容性极高。各种第三方库只要在il2cpp下能工作,在HybridCLR下也能正常工作。其他方案往往要大量魔改源码。
  • HybridCLR内存效率极高。HybridCLR中热更新类型与主工程的AOT类型完全等价,占用一样多的空间。其他方案的同等类型则是假类型,不仅不能被runtime识别,还多占了数倍空间。
  • HybridCLR执行效率高。HybridCLR中热更新部分与主工程AOT部分交互属于il2cpp内部交互,效率极高。而其他方案则是独立虚拟机与il2cpp之间的效率,不仅交互麻烦还效率低下。

文档

稳定性状况

=== 庆祝于 2021.6.7 第一款使用HybridCLR的android和iOS双端休闲游戏正式上线 ===,7月份还有几款中重游戏上线或者对外测试。

技术评估上目前稳定性处于Beta版本。由于HybridCLR技术原理的先进性,bug本质上不多,稳定得非常快。

  • 目前PC、Android、iOS 已跑通所有单元测试,可稳定体验使用。
  • 测试了游戏常用库和框架的兼容性,兼容性良好。只要能在il2cpp backend下工作的库都可以在HybridCLR下正常工作。甚至那些与il2cpp因为AOT问题不兼容的库,现在因为HybridCLR对il2cpp的能力扩充,反而可以正常运行了。具体参见 兼容性报告
  • 已经有几十个大中型游戏项目较完整地接入HybridCLR,并且其中一些在紧锣密鼓作上线前测试。具体参见收集的一些 完整接入的商业项目列表

支持与联系

  • 开发交流,欢迎加QQ群或邮件联系
    • QQ群:651188171 HybridCLR技术交流群 (官方主群)。可以反馈bug,但不要在群里咨询基础使用问题
    • QQ群:428404198 HybridCLR使用疑难咨询群 (新手群)。新手使用过程中遇到问题,都可以在群里咨询。
    • 邮箱:taojingjian#gmail.com

RoadMap

HybridCLR虽然与il2cpp相关,但绝大多数核心代码独立于il2cpp,很容易移植(预计一个月)到其他不支持AOT+Interpreter的CLR平台。无论unity如何版本变迁,哪怕废弃了il2cpp改用.net 6+,HybridCLR会持续跟进,稳定地提供跨平台的CLR热更新服务,直至某天.net官方直接支持AOT+Interpreter,则HybridCLR完成其历史使命。

  • 支持Unity 2019、2020和2021系列版本 (2022.6 -)
  • 支持32位 (2022.6 - 2022.7)
  • 指令优化,编译后指令数减少到原来1/4-1/2,基础指令和大多数对象模型指令有100%-300%的性能提升。 (2022.7 -)
  • 支持增量式gc (2022.8 -)

license

HybridCLR is licensed under the MIT license

MIT License Copyright (c) 2022 focus-creative-games Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

HybridCLR是零成本、高性能的unity c#的热更新方案。 Zero-cost, high-performance unity c# hot update solution 展开 收起
C++
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/Kenziio/hybridclr.git
git@gitee.com:Kenziio/hybridclr.git
Kenziio
hybridclr
hybridclr
main

搜索帮助

344bd9b3 5694891 D2dac590 5694891