120

回帖

6998

金币

3816

积分

积分
3816
发表于 2024-2-27 16:25:24 | 显示全部楼层 |阅读模式

马上注册,下载996引擎,与更多游戏开发者交流。

您需要 登录 才可以下载或查看,没有账号?注册

×
键值对功能在处理一些给个人添加标记的场景下挺好用的,虽然lua有系列化转表和表转系列化的功能了但是处理一些给个人添加标记(用变量只使用一次的场景),个人还是比较喜欢使用官方的键值对功能,三端lua官方提供了一个自定义的函数

官方提供的获取键值对代码:

function getVarCache(play,varName,key)
    local str = getplaydef(play, varName)
    local result = {}
    for k, v in string.gmatch(str, "([^=]+)=([^,]+)") do
        k = k:gsub(",", "")
        result[k] = v
    end
    return result[tostring(key)] or ""
end



而且这个函数的原理是系列化之后遍历再遍历的方式来取值,一旦键值对数量多了,耗时就比较高了。
还有没有提供写修改键值对的函数,通过调用txt的命令耗时也高,大概在100多这个样子
我自己写了一个lua的修改键值对的函数,也是通过系列化操作的,一旦键值对数量多了,使用的耗时就比较高

于是我写了一个通过正则匹配的方式来修改和读取键值对:
function getVarCache(play, varName, key)
    local str = getplaydef(play, varName)
    local newstr = "," .. str .. ","
    local pattern = "," .. key .. "=([^,]+),"
    local matchValue = newstr:match(pattern)
    if matchValue then
        return matchValue
    else
        return ""
    end
end



通过系列化方式来存键值对:
-- 系列化算法存键值对
function updateVarCache(play, varName, key, value)
    local str = getplaydef(play, varName)
    local result = {}
    for k, v in string.gmatch(str, "([^=]+)=([^,]+)") do
        k = k:gsub(",", "")
        result[k] = v
    end

    if value ~= nil and value ~= "" then
        result[tostring(key)] = tostring(value)
    else
        result[tostring(key)] = nil
    end

    local updatedStr = ""
    for k, v in pairs(result) do
        updatedStr = updatedStr .. k .. "=" .. v .. ","
    end
    updatedStr = string.sub(updatedStr, 1, -2) -- 去掉最后的逗号

    setplaydef(play, varName, updatedStr)
end


通过这个方式修改写入,因为每次要把字符串取出来再系列化在遍历修改,再遍历系列化存回去,一旦键值对数量高了,耗时就高


我这里写了一套通过正则算法匹配来修改键值对的方法,放到附件里面的

一共有4个函数

系列化算法取键值对 (官方提供的)
系列化算法存键值对

正则算法取键值对
正则算法存键值对

系列化一次创建200条耗时

系列化一次创建200条耗时
系列化取键值对耗时.png 系列化修改耗时.png
正则法:一次创建200条数据耗时.png 正则方式取键值对的耗时.png 正则修改耗时.png

函数.rar

871 Bytes, 下载次数: 144, 下载积分: 金币 -1

售价: 1 金币  [记录]

本帖被以下淘专辑推荐:

  • · lua|主题: 2, 订阅: 0
回复

使用道具 举报

34

回帖

1万

金币

5890

积分

积分
5890
发表于 2024-2-28 21:34:41 | 显示全部楼层
大佬牛皮啊
回复

使用道具 举报

56

回帖

2384

金币

1325

积分

积分
1325
发表于 2024-2-28 23:45:14 | 显示全部楼层
果断MARK,996引擎起飞!
回复

使用道具 举报

56

回帖

2384

金币

1325

积分

积分
1325
发表于 2024-2-28 23:45:19 | 显示全部楼层
果断回帖,每分每秒都在支持996引擎!
回复

使用道具 举报

56

回帖

2384

金币

1325

积分

积分
1325
发表于 2024-2-28 23:45:24 | 显示全部楼层
666
回复

使用道具 举报

590

回帖

1万

金币

6081

积分

积分
6081
发表于 2024-2-29 09:28:40 | 显示全部楼层
996引擎很好很强大!
回复

使用道具 举报

23

回帖

1789

金币

969

积分

积分
969
发表于 2024-6-14 18:04:53 | 显示全部楼层
牛皮牛皮
回复

使用道具 举报

2

回帖

763

金币

411

积分

积分
411
发表于 2024-8-3 11:30:50 | 显示全部楼层
你真的太强了 6666
回复

使用道具 举报

8

回帖

172

金币

94

积分

积分
94
发表于 2024-9-25 23:47:33 | 显示全部楼层

果断MARK,996引擎起飞!
回复

使用道具 举报