排行榜界面打开时开启定时刷新、关闭时忘了停,玩家关了界面推送还在后台跑。界面生命周期把打开、刷新、销毁三个时机做成钩子:打开时统一注册,销毁时统一注销,谁注册谁注销,后台任务不再泄漏。生命周期钩子把资源申请与释放写在相邻位置,代码可读性与可维护性同步提升。
钩子按时机分成多张注册表,界面在各钩子里登记自己的初始化与清理逻辑,销毁时按注册的逆序逐个执行清理。
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 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 行会活动集中在攻城战,日常缺乏轻量社交场景。行会篝火答题做行会固定社交活动:每周三、周日晚在行会驻地点燃…
实战应用:用在哪里 全服答题活动办过几期,参与的人不少但黏性不足,答完就散。科举答题把答题做成两段式:每天晚八点的乡试答题筛…
n n n 实战应用:用在哪里 n战斗中打字沟通慢且危险,队伍协作靠喊话效率太低。快捷短语栏在屏幕底部提供八条可自定义的战斗…
n n n 实战应用:用在哪里 n龙脉区域的野外宝箱是散人玩家的每日福利:每逢整点在龙脉区域随机刷新十五个宝箱,分三档给不同…
实战应用:用在哪里 同一玩家的两条消息走了不同的处理路径,先发的后到,装备穿上的消息比脱下的消息晚处理,面板状态错乱。消息有…
实战应用:用在哪里 战斗日志全量打印,一天写满一块硬盘,翻日志像大海捞针。日志采样按类别分策略:错误日志全量保留、行为日志按…