代码热重载(lua)

所谓热重载就是在运行期间替换和更新代码,便于UI代码测试阶段使用

步骤:

  • 检测哪些lua文件发生变化

  • 重新加载lua模块,保留数据,替换函数(因为我们做了函数、数据分离,所以我这个工程目前只考虑替换函数)

重载lua模块注意点:

  • 其它模块缓存了旧模块的函数的处理
  • upvalue值的处理
  • 需要更新的模块的元表的处理
  • 对于正在运行的函数的处理,比如update

如何检查lua文件变化以及更新

使用C# FileSystemWatcher 类(多线程运行),检测指定路径中lua的文件的变化,将lua模块的替换和更新逻辑添加到该类的Change Event中,当lua文件发送改变时触发Change事件来更新代码

Lua模块如何替换更新

使用require加载lua代码后,package.loaded会记录加载好的lua模块,记录好的模块再次require,则不会重复执行。所以在获取新模块之前需要储存旧的模块并将package.loaded("name") = null值为空。

lua代码内容主要由表,数据, 方法组成(表也由这三部分组成)所以总的来说就是处理数据和方法函数,替换函数之前需要储存旧函数中使用的upvalue值,函数替换后再将upvalue值转移过来。
获取旧函数中upvalue值的方法:local name,  value = debug.getupvalue(old_func, i) 【old_func函数名, i 第几个upvalue】name不为空则有upvalue
新函数设置upvalue的方法:debug.setupvalue(new_func, i, old_value)【old_func函数名, i 第几个upvalue,old_value】


【Lua运行时热重载①】检测Lua文件发生变化 - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值