zoukankan      html  css  js  c++  java
  • lua 热更新

    热更新主要用于不停机修复bug等。故其重点是更新逻辑代码。
    切记模块设计时,分为数据和逻辑。
    1、所有脚本文件,除了入口的文件外,其他都写成module形式;
    2、模块中不要有文件内的local变量,目前未知此种变量存到哪里了,local修饰的函数无所谓;
    3、所有的数据部分直接存到_G.game_instance.xxx中,然后直接重新load初始化入口文件,并卸载所有的脚本文件,就会触发重新加载;


    例子:
    此例中,当执行main.lua后,会暂停,此时修改a.lua中的funca函数中的print("a33")为print("a"),改完后保存,然后在main.lua的控制台中按任意键,发现输出值已经为刚才变更的值了,如此,成功。
    核心函数为main.lua中的:reloadmodule函数

    模块a
    a.lua

    module(..., package.seeall)
    
    function funca()
     print("a33")
    end

    模块b
    b.lua

    module(..., package.seeall)
    
    local atb = require "a"
    
    function funcb()
     atb.funca()
    end

    主程序
    main.lua

    local tbb = require "b"
    local atbb = require "a"
    
    local function reloadmodule(modulename)
     local oldmodule = _G[modulename]
     for k, v in pairs(oldmodule) do
      oldmodule[k] = nil
     end
    
     _G[modulename] = nil
     package.loaded[modulename] = nil
     require(modulename)
     local newmodule = _G[modulename]
     for k, v in pairs(newmodule) do
      oldmodule[k] = v
     end
     oldmodule._M = oldmodule
     
     _G[modulename] = oldmodule
     package.loaded[modulename] = oldmodule
    
     oldmodule = nil
     newmodule = nil
    end
    
    
    collectgarbage("collect")
    print(collectgarbage("count") * 1024)
    tbb.funcb()
    print("a tb: ", atbb)
    
    os.execute("pause")
    
    reloadmodule("a")
    
    tbb.funcb()
    print("a tb: ", atbb)
    collectgarbage("collect")
    print(collectgarbage("count") * 1024)
  • 相关阅读:
    [BZOJ2049] [SDOI2008] 洞穴勘测
    BZOJ2594: [Wc2006]水管局长数据加强版
    P4211[BZOJ 3626] [LNOI2014]LCA
    FindLetter 类——查找文件中特定的字符,每一行开头为某一个字符,则跳过
    SolrJ 的运用
    Golang
    注册免费试用12个月的亚马逊AWS云计算服务
    TensorFlow学习笔记(一)
    Hexo之旅(四):文章编写技巧
    高阶函数
  • 原文地址:https://www.cnblogs.com/lcinx/p/10570822.html
Copyright © 2011-2022 走看看