排行榜界面打开时开启定时刷新、关闭时忘了停,玩家关了界面推送还在后台跑。界面生命周期把打开、刷新、销毁三个时机做成钩子:打开时统一注册,销毁时统一注销,谁注册谁注销,后台任务不再泄漏。生命周期钩子把资源申请与释放写在相邻位置,代码可读性与可维护性同步提升。
钩子按时机分成多张注册表,界面在各钩子里登记自己的初始化与清理逻辑,销毁时按注册的逆序逐个执行清理。
local hooks = { open = {}, close = {} }
local function onOpen(fn) table.insert(hooks.open, fn) end
local function onClose(fn) table.insert(hooks.close, fn) end
local function fireOpen()
for _, fn in ipairs(hooks.open) do fn() end
end
local function fireClose()
for i = #hooks.close, 1, -1 do hooks.close[i]() end
end
打开排行榜界面时注册定时刷新与数据拉取,关闭界面时反向注销定时器与消息监听,句柄一一对应不泄漏。
local timerId
local function openRank()
GUI:Win_Open("ui/rank_main")
timerId = SL:Schedule(refreshRank, 5)
fireOpen()
end
local function closeRank()
if timerId then
SL:UnSchedule(timerId)
timerId = nil
end
fireClose()
end
打开关闭界面二十轮,注册的定时器与监听全部成对注销;销毁后到达的推送不触发任何回调;钩子内抛出的异常被捕获不影响其他钩子。生命周期框架对全部常驻界面统一接入,散落在各处的定时器与监听注册代码迁移进钩子,总量少了四成。监控界面关后的残留任务数,残留大于零即定位到未注销的注册点。生命周期框架对全部常驻界面统一接入后,新增界面的接入成本降到一个钩子函数,研发不再重复实现注销逻辑。
fireClose 用正序执行清理钩子,后注册的资源先于依赖它的资源被释放,清理顺序错乱,销毁钩子统一逆序执行。钩子回调里再注册新钩子,遍历过程中表长度变化导致部分钩子被跳过,注册动作在遍历窗口外统一处理。刷新钩子每五秒拉一次全量榜单,接口压力超预期,钩子内改为拉增量差异数据。界面重开时 open 钩子重复注册,同一任务跑了双份,注册接口按名字去重后才稳定。生命周期框架上线后,界面相关的后台任务泄漏从每周三起降到零,框架的纪律性替代了个人的自觉性。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 周五晚高峰副本掉线事故:三百支队伍的成员在副本里掉线后无法重连,只能等副本超时踢出,客服工单一夜积压九百…
实战应用:用在哪里 行会活动集中在晚上八点的攻城战,白天在线的成员没有参与感。行会运镖做成轻协作玩法:行会每周两趟集体运镖,…
实战应用:用在哪里 沙巴克城主每周可以打出两张政策牌影响全服:双倍经验日让全场经验翻倍、怪物狂暴日让野怪攻击提升三成、和平协…
实战应用:用在哪里 故障演练总演同一套拔线流程,队伍熟练了但新故障类型没覆盖。演练题库把历史故障转化成十个演练场景,每季度随…
实战应用:用在哪里 排行榜界面打开时开启定时刷新、关闭时忘了停,玩家关了界面推送还在后台跑。界面生命周期把打开、刷新、销毁三…
实战应用:用在哪里 沃玛教主被击杀后四小时原地重生,重生前一分钟全服预告,教主重生点位在窝点周围五格内随机偏移,蹲点守尸的策…