代码热更新探讨

Reading time ~1 minute

关于iOS上反射的限制

iOS上对反射是部分支持,即支持使用反射读取源代码,但不支持使用反射动态生成可执行代码。 下面是限制反射的命名空间: Profiler Reflection.Emit Reflection.Emit.Save functionality COM bindings The JIT engine Metadata verifier (since there is no JIT)

换句话说IOS支持的是Reflection的命名空间的部分方法,但不代表支持Emit下的命名空间的方法,总之,IOS不支持以动态方式创建新的方法和类型。

常用代码热更新方案:

手游热更的基本原理很简单,就是启动时检测下是否有新版本文件,有的话就下载覆盖老文件,然后启动。问题是对于资源这样是可以的,但是对于代码,因为iOS不支持JIT,所以不能将DLL打包为资源然后反射调用。所以手机上代码热更一直都很麻烦,基本上都是想办法运行时解释执行代码。

目前常用的几种热更方案:

  1. 内嵌虚拟机,使用脚本语言(基本都是Lua)
    toLua、sLua等,直接使用lua开发大部分性能不敏感的功能。lua代码都是运行时才编译的,不运行的时候就是文件资源,所以更新逻辑只需要更新脚本,不需要再编译,因而lua能实现“热更新”。
    缺点就是性能有影响,需要熟悉Lua语言,不能用宇宙第一IDE VS。

  2. ILRuntime
    作者实现了IL运行时,可以直接使用C#进行热更新。 性能可能较慢,而且目前使用的成熟项目较少,但个人觉得这并不算太大的问题,目前发展的也比较成熟。 毕竟能使用C#对大部分项目还是很友好的。 还有个ET框架,前后端统一,感觉不错。

  3. 强类型语言翻译至Lua CSharp.lua、Haxe语言。

XLua的Hotfix

这是XLua最特色的功能,开发只用C#,运行时也是C#,不打补丁基本和原有程序一样,只有出现bug时才用Lua修改出问题的地方,下次整包更新时再换回C#。
如果仅希望用热更新来fix bug,这是强烈建议的做法。对于老项目接入也可减少工作量。
(有一个 cshotfix 是基于ILRuntime的类似项目)

对于打了hotfix标签的类,xLua会在il层面注入代码。执行时替换为执行Lua的函数。

你可能会想我怎么知道哪个地方会出bug,然后打标签呢,很简单,把大部分类都打上hotfix标签。。。
另外,如果觉得每个类打标签太累,还可以使用批量配置,这也是官方建议的方式。

Scriptable Objects 及 游戏架构

Scriptable Objects 相关介绍,及基于其的游戏架构技术 Continue reading

AssetBundle 最佳实践

Published on January 29, 2019

AssetBundle 基础总结

Published on January 27, 2019