跳到主要内容

差分混合执行

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

提示

DHE只包含在旗舰版中,具体请见旗舰版介绍

原理

将标记为DHE的程序集也打入主包中,运行后再加载最新的热更新dll。执行过程中,调用某个DHE程序集的函数时,如果函数未发生变化,则直接调用原生的AOT实现,否则以解释方式执行最新的代码。 由于实践中两个版本往往不会修改太多代码,DHE基本上能接近原生的性能水平。

特性与优势

  • 未变化部分代码性能与原生完全相同,相较纯解释版本提升惊人的3-30倍甚至更高,整体几乎达到原生性能水平。
  • 可以任意变更代码,对代码基本无入侵,几乎没有特殊注意事项,使用方式跟社区版本近似。
  • 工作流简单,不需要像xxxfix之类的方案那样自己标注哪些函数发生变化,由工具全部自动处理
  • 对项目的改造成本比纯热更新版本更低。例如可以直接在DHE中定义extern函数,而不需要移到AOT模块。
  • 原生代码已全部在包体中,被iOS拒审的风险大幅降低

未支持特性

  • 加载DHE热更新代码前不能执行DHE对应的AOT assembly中的任何代码。意味着DHE不支持像mscorlib这种基础库的差分混合,但支持传统热更新assembly的差分热更新
  • 由于第一条的限制,不支持在DHE程序集中使用[InitializeOnLoadMethod]Script Execution Order settings
  • 不支持DHE脚本挂载在随包资源中,包括Resources
  • 不能在DHE程序集中通过热更新新增extern函数

dhao文件

dhao文件是DHE技术的核心概念。dhao文件中包含了离线计算好的最新的热更新dll中变化的类型和函数的信息,运行时直接根据dhao文件中信息决定执行某个热更新函数时,应该使用最新的解释版本还是直接调用原始的AOT函数。 离线计算好的dhao文件对于DHE技术极为关键,如果没有dhao文件,需要额外携带原始AOT dll,并且计算函数变化的代价极其高昂。

通过对比最新的热更新dll与打包时生成的AOT dll,离线计算出变化的类型与函数,保存成dhao文件。因此DHE机制要正常工作,必须依赖于dhao文件的正确性,而dhao文件的正确性 则依赖精确提供最新的热更新dll和打包时生成的AOT dll。