背包系统编写

项目中背包系统的数据处理导致操作卡顿,优化方案是将数据分开处理并使用缓存。每帧缓存服务端下发的物品数据,下一帧统一更新并派发事件通知监听者,减少频繁广播,提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背包系统编写

简述:

项目中由于背包系统的数据处理存在问题,导致操作背包时导致卡顿;
优化思路:将背包涉及到的数据分开处理(各用一份table)-回收缓存,仓库数据,背包分类数据,背包数据改变需要派发到监听者的信息。

由于服务端是每个物品单独下发一次协议,一帧内可能存在大量下发,故缓存至一个cache列表,在下一帧更新背包数据,及派发背包数据改变事件(一帧派发一次,包含的数据为一帧内所有的数据改变)。避免每一次协议下发均进行游戏广播注册该事件的监听者。

代码实现:

--------------------------------------------------------
-- 背包数据改变派发
--------------------------------------------------------
BagData = BagData or BaseClass()

BagData.CACHE_LIST = {}                 --背包操作缓存列表

--[[
    通用方法 设置背包操作延迟;
    调用SetDaley(ture) 开始缓存数据 期间背包产生的数据变化 均缓存至BagData.CACHE_LIST
    调用SetDaley(false) 一次性更新数据
]]

--每个物品所需派发的数据格式
--@{change_type = ITEM_CHANGE_TYPE.ADD/DEL, data = @改变的物品数据, reason = ItemGetType.TakeOffItem/AwardItem/DealGetItem...}
function BagData:SetDaley(is_daley)
    self.is_daley = is_daley

    if is_daley then
        self.item_daley_timer = GlobalTimerQuest:AddDelayTimer(function()
            self:SetDaley(false)
        end, 5)
    else
        GlobalTimerQuest:CancelQuest(self.item_daley_timer)
        self.item_daley_timer = nil
        for k, v in ipairs(BagData.CACHE_LIST) do
            if v.change_type == ITEM_CHANGE_TYPE.ADD then
                self:AddOneItem(v.data)
            elseif v.change_type == ITEM_CHANGE_TYPE.DEL then
                self:DeleteOneItem(v.data)
            end
        end

        --数据设置完成 回调
        --通知监听者
        self:NoticeItemsChange(BagData.CACHE_LIST)

        --清除缓存
        BagData.CACHE_LIST = {}
    end
end

--协议下发调用方法
function BagData:UpdateData(change_type, data, reason)
    --0.01秒期间 只更新设置一次数据
    if not self.is_daley then
        self:SetDaley(true)
        GlobalTimerQuest:AddDelayTimer(function()
                self:SetDaley(false)
        end, 0.1)
    end

    --加入缓存列表
    table.insert(BagData.CACHE_LIST, {change_type = change_type, data = data, reason = reason})
end

--缓存后派发 与之前的事件派发不兼容 数据格式不一致 需一一修改
--创建一个背包数据改变事件
local function CreateItemsChangeEvent(items_change_info_list)
    local event = {}

    --获取数据列表
    function event.GetChangeDataList()
        return items_change_info_list
    end

    --某些监听者需遍历所有改变数据
    function event.CheckAllItemDataByFunc(func)
        for k,v in pairs(items_change_info_list) do
            func(v)
        end
    end

    return event
end

--通知监听者
function BagData:NoticeItemsChange(items_change_info_list)
    self:DispatchEvent(BagData.BAG_ITEM_CHANGE, CreateItemsChangeEvent(items_change_info_list))
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值