zoukankan      html  css  js  c++  java
  • lua热重载

    热重载,就是不重新开unity让代码的变化直接看出来,一般在开发时候使用

    lua中通过require导入的文件,最终都存在package.loaded这个table中。
    require会判断是否文件已经加载避免重复加载同一文件
    所以需要先把package.loaded中对应的内容置空,然后再重新导入

    for key,val in pairs(package.loaded) do
         print(key)
         if(key == "xxx") then
            package.loaded[key] = nil;
            require(key);
         end
    end

    这种重新require会让这个脚本在内存中的数据丢失,谨慎使用

    1. 将package.loaded[filename] = nil, 将模块置空.
    
    2. 重新调用require,require(filename).

    所以lua如果做了分层,数据和逻辑分离,只reload逻辑层,应该是可以的

    注意的是,如果重新require的代码出错了,那么

    package.loaded[filename] 
    会一直为nil的,会影响后面的模块

    解决办法是把之前的保存一份,如果出错用老的,并且提示
    -- require_ex.lua
    function require_ex(filename)
        local old_content
        if package.loaded[filename] then
            -- 把旧的模块保存起来
            old = package.loaded[filename]
            -- 然后package.loaded[filename]赋空
            package.loaded[filename] = nil
        end
             
         -- xpcall下执行require
        local ok,err = pcall(require, filename)
        if not ok then
            --热更失败,将旧值赋回去
            print("hotfix fail, err msg ",err)
            package.loaded[filename] = old_content
            return false
        end
    
        return true
    end

    参考文章:https://www.cnblogs.com/lewiskyo/p/6160059.html

    之前又看一个框架也有这种功能,不过他是使用类似cookie机制实现:https://www.jianshu.com/p/eebd5cfce87f

  • 相关阅读:
    python 全局变量与局部变量
    Python 百分号字符串拼接
    Python集合的基本操作
    sorted by value in dict python
    gVim vundle
    vim config
    vim move the cursor in a long sentence
    步步为营-37-自动生成数据库连接字符串
    步步为营-36-ADO.Net简介
    步步为营-35-SQL语言基础
  • 原文地址:https://www.cnblogs.com/sanyejun/p/9808753.html
Copyright © 2011-2022 走看看