Lua热更

作者: 凉夜lrs | 来源:发表于2021-01-21 17:04 被阅读0次

    参考:
    https://blog.csdn.net/cooclc/article/details/104825564

    lua加载一个文件的方式可以有:dofile,loadfile以及 require。其中loadfile是只编译不执行,dofile和require是同时编译和执行。而dofile和require的区别是dofile同一个文件每次都要加载,也就是说,dofile两次返回来的是两个不同的地址。而require同一个文件,不管多少次都是都返回同一个地址,其原因是lua的地址缓存在了package.load()中。所以效率比dofile要高许多,因而现在一般都是用require加载文件。

    Lua热更新的两种实现方式

    1. 简单版但是有缺陷

    package.load("modelname") = nil
     
    -- 修改modelname.lua的数据
     
    require("modelname")
    

    既然你有缓存,我直接置为空不就好了吗?然后重新require一次把修改好的加进来。这样子做的话第二次require的数据可能是正确的,但是之前require过一次的数值却仍然错误,所以说程序除非在之前没有加载过这个文件,否则得到的结果不完善。

    2. 复杂版但是很有用

    function reload_module(module_name)
        local old_module = package.loaded[module_name] or {}
        package.loaded[module_name] = nil
        require (module_name)
     
        local new_module = package.loaded[module_name]
        for k, v in pairs(new_module) do
            old_module[k] = v
        end
        --执行到这里应该已经可以了
     
        package.loaded[module_name] = old_module
        return old_module
    end
    

    使用一个表存储新修改后的所有数值,然后循环赋值给旧的值,这样就可以确保同一个旧地址也可以得到正确的数据。

    相关文章

      网友评论

          本文标题:Lua热更

          本文链接:https://www.haomeiwen.com/subject/inrdzktx.html