不是每一件事都要立刻做完:掉落的归属结算、邮件的批量投递、排行榜的更新——非紧急的任务进队列慢慢消化,玩家的关键路径(攻击、移动)永远优先。延迟结算是性能的调度学。
---延迟结算:优先级的任务队列
local Queue = { high = {}, normal = {}, low = {} }
function Queue.push(priority, fn)
table.insert(Queue[priority], fn)
end
setontimerex(110, 1)
function Queue.drain()
-- 每秒的预算 50 毫秒
local budget = 0.05
local t0 = os.clock()
for _, lvl in ipairs({ "high", "normal", "low" }) do
while #Queue[lvl] > 0 do
local fn = table.remove(Queue[lvl], 1)
local ok, err = pcall(fn)
if not ok then
Ops.alert("延迟任务异常: " .. tostring(err))
end
if os.clock() - t0 > budget then
return -- 预算耗尽,下轮继续
end
end
end
end
队列的三级优先:高(交易与支付的结算)、中(掉落的归属与邮件)、低(排行榜与统计的更新),每秒的消化预算 50 毫秒——预算的墙让队列的消化永远不挤占玩家的关键路径。任务用闭包入队:结算所需的上下文在入队时捕获,到点执行时自带全部的原料。异常的隔离用 pcall:单个任务的报错不拖垮队列的整轮消化。
---延迟的时效:掉落归属的 3 秒上限
function Drop.delayedSettle(bossId)
Queue.push("high", function()
local owner = BossDamage.owner(bossId)
if owner then
BossDrop.assign(bossId, Drop.listOf(bossId))
end
end)
end
---队列的积压监控
setontimerex(111, 5)
function Queue.monit()
local total = #Queue.high + #Queue.normal + #Queue.low
if total > 2000 then
Ops.alert("队列积压", total)
end
end
延迟有时效的分级:掉落的归属 3 秒内必须结算(玩家盯着地上等裁决)、邮件的投递 5 分钟内、统计的更新容忍 1 小时——时效的承诺写进每类任务的注册,超时的任务升级优先级。积压的监控在 2000 条的警戒线:积压的突增说明产出的速度超过消化的能力,预算的上调或任务的降频二选一。延迟结算的正确性靠上下文的快照:入队时捕获的数据(BOSS 的伤害表、掉落的清单)在结算时依然有效,变化的中间态用版本号丢弃过期的任务。
队列的消化延迟分位监控:入队到执行的耗时分布,各优先级各自的 P95 对齐时效的承诺;预算的使用率统计,预算长期打满即是扩容的信号。
预算的检查曾经放在任务完成后,单个慢任务把一秒的预算全部吃光,前置的预算判断修复。闭包捕获的上值曾经在入队后被释放,结算时的空引用,上下文的快照化替代引用捕获。队列的优先级曾经只有两级,统计类的低优任务饿死在交易的高峰,三级的分层让低优也有活路。
任务的时效分级注册进队列的接入文档,每类任务有自己的承诺。预算的毫秒数随在线的规模配置,高峰的动态调整有预案。队列的积压量与消化的速率进性能的看板,调度的健康一屏可见。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 两百毫秒延迟下放技能,按下按钮到技能出手之间的空窗让操作手感大打折扣。弱网补偿方案:客户端对移动与普攻做…
实战应用:用在哪里 每个技能都有冷却时间,散落在各处的冷却判断让代码难以维护。统一冷却管理框架把所有技能的冷却计时收拢到一个…
实战应用:用在哪里 每个技能都有冷却时间,散落在各处的冷却判断让代码难以维护。统一冷却管理框架把所有技能的冷却计时收拢到一个…
实战应用:用在哪里 检测到异常交易后需要立即冻结资金防转移:冻结操作把目标账号的交易功能暂停并冻结背包金币,冻结后给安全组留…
实战应用:用在哪里 混沌麒麟的召唤是全服瞩目的高光时刻:入场特效做足仪式感——全屏暗幕、金光裂缝、麒麟踏火登场三段演出,特效…
实战应用:用在哪里 好友动态流让社交系统有了"朋友圈"的感觉:好友获得成就、升到关键等级、击杀世界BOSS时自动推送到动态流…