文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
差分混合执行
HybridCLR开创性地实现了 Differential Hybrid Execution(DHE) 差分混合执行技术。即可以对AOT dll任意增删改,会智能地让变化或者新增的类和函数以interpreter模式运行,但未改动的类和函数以AOT方式运行,让热更新的游戏逻辑的运行性能基本达到原生AOT的水平。
:::tip
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。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论