「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。
作为一名优秀的开发者,对于技术的探求应该是永无止步的,如何让自己更进步,那就只有不停的学习,不停的充电.而这些都都是说起来容易做起来难,坚持才是难的地方 --蛙哈哈
XLua实现原理-01
1.什么是热更新
热更新分为两个方面分别是客户端和服务器
- 客户端在不重新下载安装包的前提下,进行的游戏内资源和逻辑的更新行为.
- 服务器在不停服的情况下进行配置和逻辑的更新行为.
总结来讲就是不影响游戏正常运营的前提下(比如客户端强更,服务器停服维护等都属于音响游戏正常运营的情况),对游戏内的配置和行为进行修改的行为就可以称之为热更新.
2.为什么需要热更新
-
开发会有bug
-
业务和需求会不断的变化
-
每次强更都会导致用户的流失
-
应用商店提包/审核都需要时间
3.为什么C#脚本不可以直接更新
AOT JIT的方式区别,可以参考这篇文件
IOS不允许某些反射的高级功能,因此不能用更新DLL/so的方式进行更新,因此只有IOS平台需要热更新,其他平台直接更新即可
因此需要为IOS单独制作一套更新机制,但是维护多套机制就更累, 所以就用了为IOS制作的那套流程.
C#有一些动态载入DLL或者CS文件的方法,但是因为IOS必须AOT的原因,在IOS下都是不能使用的,因此在ios下不能动态载入dll或者cs文件,于是把传统dotnet动态路径封死了。
比如上述的这些命名空间,里面的类就可以实现冬天在载入DLL.
机智的程序员又想到了另外一种方法,既然不让我更新C#, 那我更新Lua总可以把,我只需要把Lua虚拟机植入在游戏立,把lua脚本打进ab包,玩家通过解压ab包来更新游戏逻辑和游戏界面,不就可以实现我想要的功能了么?于是 名为*Lua的各种框架就出现了,本作者也列举了一些在Unity开发历史上可以用来热更的框架
- C#Light:
是框架作者开发的一种小巧的脚本语言(不是基于Lua语言的),
能在各个平台实现热更新,但该框架早已停止维护
- 利用C#的反射:
这种方式只支持windows以及安卓这种支持JIT的平台,对于IOS就不适用了,
IOS这种Full-AOT的平台不支持生成新的代码,因此这种热更方式很少用到
- uLua:
是Lua的第一款插件,但是现在已经停止更新不再维护
- sLua:
代码质量好(代码比toLua代码更清晰),但是性能低于toLua。
- toLua:
uLua停止更新后出现的新的热更新插件,基于toLua作者开发了一款luaframework,目前比较主流
- ILRuntime:
这个框架打破了C#不能做ios平台热更的规则(在ios平台中是以ILRuntime+dll的方式解释执行,当然是在IL2CPP下)。
有了这个框架,开发者只需使用C#这一种语言即可,而不用在C#和lua之间切换,
- xLua:腾讯开发的Lua插件,目前比较主流
经过一些年的更新迭代,现在用的最多的就是XLua和toLua,下一期文章咱们就以XLua来进行讲解.
这是XLua的官方介绍:
xLua为Unity /.Net / Mono等C#环境增加Lua脚本编程的能力,借助xLua,这些Lua代码可以方便的和C#相互调用.
可以运行时把C#实现(方法,操作符,属性,事件等等)替换成lua实现;
出色的GC优化,自定义struct,枚举在Lua和C#间传递无C# gc alloc;
编辑器下无需生成代码,开发更轻量;