沙巴克攻城时战斗包与聊天包挤同一条队列:几百人的技能与移动消息被刷屏的闲聊消息压在后面,操作的延迟直接改写战局。消息优先级把网关出队列分成三档通道,战斗包永远优先于聊天包,拥塞时丢闲聊保操作。
---网关发送队列:按优先级分档
local CH = {
{ q = {}, limit = 500, budget = 20 }, -- P0 战斗/移动
{ q = {}, limit = 300, budget = 60 }, -- P1 交互/物品
{ q = {}, limit = 200, budget = 200 }, -- P2 聊天/特效
}
function CH.push(conn, pkg, pri)
local c = CH[pri] or CH[3]
if #c.q >= c.limit then
if pri >= 2 then return false end -- P2 满则丢弃
table.remove(c.q, 1) -- 高优挤掉最老包
end
c.q[#c.q + 1] = { conn = conn, pkg = pkg, at = os.clock() }
return true
end
三档通道各自有队列上限与排队预算:P0 战斗包的预算 20 毫秒、P2 聊天包 200 毫秒。P2 队列满直接丢新包,P0 队列满挤掉最老的包——移动包过期无意义,最新位置才有价值。技能施放、移动同步走 P0,物品拾取与界面请求走 P1,聊天与飘字特效走 P2。
---每帧的发送调度:按预算逐档下发
function CH.drain()
local frameStart = os.clock()
for pri = 1, 3 do
local c = CH[pri]
while #c.q > 0 do
local item = table.remove(c.q, 1)
sendPkg(item.conn, item.pkg)
if (os.clock() - frameStart) * 1000 >= c.budget then break end
end
if (os.clock() - frameStart) * 1000 >= c.budget then break end
end
end
每帧按 P0 到 P2 的顺序下发,高档的预算耗尽即让位给下一帧,低档永远等高档清空或超时。500 人攻城的实测:P0 的排队延迟稳定在 18 毫秒内,P2 聊天在拥塞时放宽到 250 毫秒,玩家对聊天的延迟无感而对技能延迟敏感。拥塞期间 P2 的丢包率公开在网关监控上,丢的是闲聊不是操作。
三档通道的队列长度与丢包率分档监控,P0 的丢包率必须恒为零,非零即为容量规划失误。
分档初期把回城卷轴的传送确认划进 P2,玩家点回城没反应,交互类的确认框统一回归 P1。预算的检查曾经放在包内循环之外,单帧发了 3000 个聊天包卡了一帧,预算判断移进循环。P0 挤掉最老包的逻辑曾经误伤战斗结果包,移动包与结果包再分两级,结果包永不挤占。
包到通道的映射表集中维护,新消息类型接入必须登记优先级,未登记的默认 P1。优先级策略在攻城、开服等高峰档期可动态收紧:P2 的预算从 200 毫秒压到 100 毫秒。客户端对 P2 丢弃静默处理,聊天消息的序号连续性由客户端按缺口重排,界面上不产生跳变。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 跨服远征分先锋、主力、后勤三队独立推进,三线全通合围BOSS。不同战力成员都有参与感。 策划要点与配置 …
实战应用:用在哪里 副本限时挑战加入超时血量惩罚:超时后BOSS攻击递增。上线后BOSS攻击叠到十倍秒杀全队。 事故还原与补…
实战应用:用在哪里 混沌麒麟召唤是全服高光时刻:暗幕聚合、裂缝展开、麒麟着陆三段演出各1.3秒。 三段式入场演出编排 围观镜…
实战应用:用在哪里 任务对话一闪而过玩家想回顾。回看接口把对话按节点存档,面板翻阅全部对话记录。 对话存档与查询渲染 当前章…
实战应用:用在哪里 服务器承载六十张地图,空闲地图白耗资源。按需激活,末人离开后六十秒休眠。 激活与休眠触发 休眠回收 验证…
实战应用:用在哪里 坐骑资质洗炼随机重滚五条属性,锁定满意的条目不再重滚,锁定越多消耗越大。 洗炼与锁定 锁定消耗递增 验证…