背包系统编写
简述:
项目中由于背包系统的数据处理存在问题,导致操作背包时导致卡顿;
优化思路:将背包涉及到的数据分开处理(各用一份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