Lua HotFix
简介
热修复是指在不重启客户端的情况下能进行对代码逻辑的修改,同时不会影响到客户端的正常运行。
实现方法
lua的热修复实现方法十分方便。原因是lua所有的数据存储都是用table实现的。
基于这种实现方式可以很方便的修改其指向对象
如:一个table的某个key指向一个函数1
table = { key = Function1 }
这时候只要对其进行修改
table[key] = Function2
就能让他指向函数2
实现热修复就相当于让存在内存中的变量的值,指向新的值。
模块重载
下面是最简单粗暴的基于模块的热更新的实现方法:
1 | function hotfix(moduleName) |
这样可以重载整个模块,但是存储了这个模块的值的对象并不会被重载如果整个模块只用于提供直接调用的方法,可以直接用这种方式重载
用途:调试某个模块的方法,这样可以不用重启整个项目就可以进行调试
1 | -- 在会调用到模块中的脚本里 |
如果这个模块的函数被存储了起来
eg:
1 | require(module) |
那么这个时候重载模块并不能重载这个fun()
这时候就需要将全局变量中的module给重载,因为fun = module.Function
相当于让fun
指向了module.Function
的地址
此时需要将全局变量中的module.Function
地址指向新的module.Function
地址
1 | function hotfix(moduleName, modulePath) |
这样hotfix()之后存储的函数就是新的函数了
状态存储
如果重载的模块只有函数的话还好,若该模块涉及到一些状态的存储,这样重载完模块后会将状态也一并重载。如:
1 | -- 一个module |
上面这个模块当调用OnStateChange()
后模块中的stateNum
会加一
当我们重载这个模块后,由于local stateNum = 0
被重载了,所以会将 stateNum
的状态初始化置0。这种状态被重新初始化是有时候我们不希望发生的。所以需要通过一个机制来存储这个状态。
KSFramework提供了Cookie
机制可以进行状态存储,基于这个机制可以这样修改来进行重载后也能读取新的状态,避免状态再次被初始化:
1 | -- 一个module |
这样做相当于把状态存储到了不会被重载的地方,从而达到重载当前模块,而不会将状态也重载。