• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

关于lua5.3服务端热更新流程

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

 

脚本的热更新的流程都大同小异, 第一步先保存旧代码的块的数据, 第二部加载新的代码块,第三步将旧代码块的局部和全局数据拷贝到新代码块的对应的

变量中。

在服务器热更新中,主要考虑热更的内容是什么, 一般更新分两种,一种是逻辑的更新,一种是变量的值更新。

 

先谈论第一种,在lua 5.3中,继承了新的debug.upvaluejoin(f1, i, f2, j)函数,能将函数f1的第i个个upvalue引用f2的第j个upvalue, 

可以通过debug.getupvalue函数,获取ENV 的upvalue来的索引位置,找到该位置后,可以通过debug.upvaluejoin函数来实现env的交换。

 

第二种就是要更新变量值,lua中的变量值更新,除了table外,其它变量类型都可以通过直接赋值来改变值的大小。由于table的回收,会导致其它引用

该table的变量都会收到影响,会导致错误的发生,所以, table的值更新,不能通过直接赋值, 可以通过移除table里面的所有元素的值,table的table除外,

然后将新table的所有元素的值遍历赋值给旧的table,注意的是不能将table也赋值,如果新table里有新的子元素是table类型,必须要在旧table对应值里重新

创建一个新的table,递归将值拷贝。

以下是table的拷贝方法实现热更的过程:

HotFixTable = {}

-- copy a old table's all key and value  to new table, but don't release old table
local function copyTable( oldTbl, newTbl)
    for k, v in pairs(newTbl) do
        if type(v) == "table" then
            if type(oldTbl[k]) ~= "table" then
                oldTbl[k] = {}
            end
            copyTable( oldTbl[k], v)
        else
            oldTbl[k] = v
        end
    end
    return oldTbl, newTbl    
end

--table no need release
local function clearTable(tbl)
    for k, v in pairs(tbl) do
        if type(v) ~= "table" then
            tbl[k] = nil
        else
            clearTable(v)
        end
    end

    return tbl
end

--use file to hotfix the source table
function HotFixTable.hotFixByFileName(fileName, sourceTbl)
    local deskTbl
    local function newIndexFunc(tbl, name, value)--t:table, name:key, f:function
        deskTbl = value
    end

    local dummy_env = setmetatable({}, { __newindex = newIndexFunc })
    local f, err = loadfile(fileName, "bt", dummy_env)
    if f then
        local ok, err = pcall(f)
        assert(ok, err)
        if ok then
            clearTable(sourceTbl)
            copyTable(sourceTbl, deskTbl)
        end
    end
end

--use lua string to hotfix the table
function HotFixTable.hotFixByData(hitfixContent, sourceTbl)
    local deskTbl
    local function newIndexFunc(tbl, name, value)--t:table, name:key, f:function
        deskTbl = value
    end

    local dummy_env = setmetatable({}, { __newindex = newIndexFunc })
    local f, err = load(hitfixContent, "=patch", "bt", dummy_env)
    if f then
        local ok, err = pcall(f)
        assert(ok, err)
        if ok then
            clearTable(sourceTbl)
            copyTable(sourceTbl, deskTbl)
        end
    end
end

调用方法如下:

HotFixTable.hotFixByFileName("新table的保存所在文件", 旧table)

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua学习笔记之开始发布时间:2022-07-22
下一篇:
openresty开发系列17--lua中的正则表达式发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap