【脚本】lua虚拟机缓存变量,不跟引擎交互适合高频使用

就是把变量表缓存到lua虚拟机里面,原来读写一次4微秒,缓存之后1微秒甚至更低主要是在高频场景中可以不跟引擎进行交互,
我的封装放到附件了,脚本很简单,主要是思路。

-- 原理说明:
-- 正常情况下使用 setVar 和getVar 不加最后一个参数。
-- 就和官方接口 getplaydef(play, varName) setplaydef(play, varName, value) 是一个性质。变量名需要使用官方的S N U T 开头的。
-- 只是在存入的时候会多存入一份到缓存表里面。
-- 读的时候优先从缓存表里面读,如果缓存表里面没有就会去引擎里面查找变量并且更新缓存表,这样就不用担心在加载了QF表清空没有值。
-- 如果加最后一个参数,比如getVar(play,"哈哈",true) 就是直接以键值对的形式写到lua表里面,变量名可以随便,完全不跟引擎交互,建议做一些高频触发临时计算的场景使用。
-- 正常情况下使用官方的变量不加最后一个参数就可以了,可以优化读取的性能。
-- Lua虚拟机缓存变量
local cachedVar = _G.cachedVar or {}
_G.cachedVar = cachedVar

local function initializePlayerCache(play)
    if not cachedVar[play] then
        cachedVar[play] = {}
    end
    return cachedVar[play]
end

function getVar(play, varName, spare)
    local cachedData = initializePlayerCache(play)
    local value = cachedData[varName]
    if spare then
        return value or 0
    else
        if not value then
            value = getplaydef(play, varName)
            cachedData[varName] = value
        end
        return value
    end
end

function setVar(play, varName, value, spare)
    local cachedData = initializePlayerCache(play)
    cachedData[varName] = value
    if not spare then
        setplaydef(play, varName, value)
    end
end
-- 全局变量
function getSysVar(varName, spare)
    local value = cachedVar[varName]
    if spare then
        return value or 0
    else
        if not value then
            value = getsysvar(varName)
            cachedVar[varName] = value
        end
        return value
    end
end

function setSysVar(varName, value, spare)
    cachedVar[varName] = value
    if not spare then
        setsysvar(varName, value)
    end
end
--注意登陆大小退时候要赋值一下
function login(play)
    _G.cachedVar[play] = {}
end

--人物小退触发
function playreconnection(play)
    _G.cachedVar[play] = nil
end

--人物大退触发
function playoffline(play)
    _G.cachedVar[play] = nil
end
感谢996传奇论坛:vweilai分享
下载地址
百度云盘
提取码:0zrc
THE END