所谓热重载就是在运行期间替换和更新代码,便于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)