前端的节奏控制器:SL:Schedule 做循环任务、SL:ScheduleOnce 做延迟任务、SL:UnSchedule 做取消,界面动画的节奏、本地缓存的刷新、输入防抖全在前端定时器里调度。前端调度器与服务端 setontimer 的分工:表现层的节奏在前端跑,数值的权威在服务端。
---循环调度 callback:回调 interval:间隔毫秒
function SL:Schedule(callback, interval) end
---一次性延迟调度
function SL:ScheduleOnce(listener, time) end
-- 界面时钟:每秒刷新在线时长显示
local clockId = SL:Schedule(function()
local min = math.floor((os.time() - loginAt) / 60)
GUI:Text_setString(timeText, "本次在线 " .. min .. " 分钟")
end, 1000)
-- 延迟任务:1.5 秒后弹出提示
SL:ScheduleOnce(function()
SL:ShowSystemTips("已在线满 1 小时")
end, 1500)
Schedule 的间隔单位是毫秒,返回的调度 ID 用于取消。界面的秒表类需求用 Schedule 每秒刷新,延迟的提示与动画用 ScheduleOnce 一次性触发。调度器的回调在界面的渲染节奏里执行,回调体的轻量原则与后端定时器一致:重活不进回调。
-- 界面关闭时取消循环调度
local function onClose(win)
SL:UnSchedule(clockId)
end
UnSchedule 按 ID 取消调度,循环调度的取消与界面销毁配对:不取消的循环调度在界面关闭后继续空转,CPU 与内存的慢性泄漏。调度器的回调异常同样要 pcall 包裹上报,一个回调的报错不应中断调度器的循环。调度与动作系统的分工:位移、缩放、淡入淡出的动画走 GUI:runAction 的动作系统,数据刷新与逻辑判断走 Schedule,动作与调度各管各的。
前端调度的存量监控(活跃的调度 ID 数),泄漏的调度在性能面板的 CPU 占比上会现形。
Schedule 的间隔传秒与传毫秒的混淆曾经让每秒刷新变成了每千秒刷新,间隔单位的统一在封装层强制毫秒。调度回调里创建新的调度(嵌套调度)曾经形成调度爆炸,嵌套调度的必要性要过设计评审。
调度器的精度是帧级不是原子钟,秒级的节奏任务用 Schedule,毫秒级的精准需求(技能动画)用动作系统的 Timeline。前端的调度与服务端的 setontimer 的配合:前端调度做表现,关键节点的数据校验回服务端,双端的时间语义对齐在联调时逐一确认。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 脚本的规范靠人盯盯不过来:命名风格漂移、全局变量乱用、缩进混着来——风格检查器把这些规则的执行自动化。提…
实战应用:用在哪里 拍卖行的出价是一场与时间的博弈:出价的按钮、倒计时的紧迫、截拍瞬间的悬念——拍卖界面的要点是出价的流程、…
实战应用:用在哪里 强化连败七次是什么体验?幸运值机制给失败的玩家一个隐性的承诺:每次失败累加幸运值,幸运值越高下一次的成功…
实战应用:用在哪里 审计日志的价值在于不可抵赖:被改过的日志比没有日志更危险——纠纷的追溯、内部的追责都建立在「日志没被动过…
实战应用:用在哪里 活动结束给 3 万玩家发奖励:一次性群发让邮件表瞬间多 3 万行、投递的队列堵塞正常的通信。批量邮件的分…
实战应用:用在哪里 面对面的交易是传奇最经典的交互:两人面对面、各自放入物品与金币、双方确认后成交。交易的协议要点是会话的建…