攻城战的一秒里,同一个行会可能触发几十次击杀事件、同一个人的血条变化上百次——事件总线被同帧的重复事件灌满。节流与合并让重复的事件合并成一次处理:观察者关心的不是每一次,而是最终态。
---事件总线:同帧同键事件合并
local Bus = { subs = {}, pending = {} }
function Bus.publish(key, payload)
local subs = Bus.subs[key]
if not subs then return end
-- 同帧的同键事件:只保留最新载荷
Bus.pending[key] = payload
end
setontimerex(94, 1)
function Bus.flush()
for key, payload in pairs(Bus.pending) do
for _, fn in ipairs(Bus.subs[key] or {}) do
fn(payload)
end
Bus.pending[key] = nil
end
end
事件的发布不再直达观察者:同键的载荷进 pending 池,同帧的多次发布只保留最新的一条,flush 在帧尾把每个键派发一次。血条变化的场景:一次群攻让 50 个人的血各变三次,合并后观察者(队伍面板、战力面板)只收到每人的最终值——观察者要的是状态不是过程,过程的每次推送都是浪费。合并的语义边界要清楚:状态类事件(血量、位置、属性)可合并,动作类事件(击杀、拾取、交易)不可合并——每次击杀都是独立的事实,合并就是丢数据。
---动作类事件的节流:窗口内限次
local Throttle = {}
function Bus.publishThrottled(key, payload, windowMs, cap)
local now = os.clock()
local t = Throttle[key]
if not t then
t = { windowStart = now, count = 0 }
Throttle[key] = t
end
if now - t.windowStart > windowMs / 1000 then
t.windowStart = now
t.count = 0
end
t.count = t.count + 1
if t.count > cap then return false end -- 超出窗口容量丢弃
Bus.publish(key, payload)
return true
end
---聊天广播的节流:每秒最多 30 条
Bus.publishThrottled("chat_world", msg, 1000, 30)
动作类事件走节流:窗口期内的容量上限,超出的事件丢弃——世界频道的广播每秒 30 条的容量在刷屏时保护观察者,丢的是噪音不是语义。节流的丢弃要有反馈:被丢弃的计数进监控,丢弃率的高企提示容量或源头需要调整。合并与节流的组合拳按事件分类配置:状态类全合并、动作类按窗口节流、交易类不节流不合并直通——三类策略的矩阵写在事件总线的文档里,新事件的接入先分类再接入。
合并率的监控:pending 池的进出比,合并掉的比例与帧的负载正相关;观察者的收到的最终态一致性测试,合并后的值与逐次派发的终值比对。
合并的键曾经太粗,同一个键把不同对象的事件互相覆盖,键里补上对象的 ID。动作类事件被误合并,击杀的两次奖励只发了一次,事件的分类登记防误配。节流的窗口曾经跨帧不清,窗口的滚动重置让容量计算失真,按真实时间窗重置。
事件的分类登记(状态、动作、交易)进事件总线的接入文档,分类决定策略。合并窗口与节流容量进配置,攻城档期的动态收紧有章法。观察者的性能随合并率自然改善,面板类观察者的收益在数据里可见。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 战士的烈火剑法一击熄火后要等八秒冷却,连招断档感强烈。疾风烈火斩在烈火剑法命中后给一次连击窗口:三秒内再…
实战应用:用在哪里 阵营对抗打到中期容易疲软:打赢没有额外好处,输掉也没有代价。阵营声望体系给阵营战装上荣誉刻度:个人与阵营…
实战应用:用在哪里 拿下沙巴克之后呢?城主除了名字挂在城墙上,对城市毫无影响。城主施政玩法让占领变成治理:城主每周获得市政令…
实战应用:用在哪里 主线路光缆被挖断的深夜,全服掉线 20 分钟,玩家以为游戏倒闭。备用线路方案给接入层配第二条出口:主线路…
实战应用:用在哪里 行会官员由帮主任命的老模式弊端明显:任人唯亲、能上不能下。行会选举接口把官员换届做成投票制:每两个月一次…
实战应用:用在哪里 烈火剑法的伤害加成、冷却时间、下一级提升,全靠玩家记忆或去官网查。技能说明悬浮卡片在鼠标悬停技能图标零点…