CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
Lua实战滑动窗口计数

【Lua实战】时间窗口计数:滑动窗口的环形数组实现

2026-09-23 01:24 作者:996 技术组 0 阅读 996引擎Lua教程传奇脚本Lua实战滑动窗口计数

实战应用:用在哪里

容量预案需要知道滚动一小时的副本进入峰值,而不是全天累计。滑动窗口用 60 个槽位每槽记一分钟的进入数,定时器每分钟滚动一格,窗口和实时可得,内存固定 60 个数字,写入读取都是常数开销。相比保留每条进入记录再回头统计的做法,环形数组把统计成本从查询时刻挪到写入时刻,峰值查询零开销。

环形数组的滚动与累加

滚动先把下一格清零并把旧值从窗口和里扣掉,计数入口往当前格累加,窗口和永远是最近 60 分钟的真实总量。

lua
local slots, cur, sum = {}, 0, 0
local function roll()
    cur = (cur % 60) + 1
    sum = sum - (slots[cur] or 0)
    slots[cur] = 0
end
local function add(n)
    slots[cur] = (slots[cur] or 0) + n
    sum = sum + n
end

峰值统计与拥堵提示

每分钟滚动后记录窗口峰值,副本入口处实时判断拥堵:窗口和超过 800 给后来者排队提示,不硬拦。

lua
local peak = 0
setontimerex(164, 60)
function ontimer164()
    roll()
    if sum > peak then
        peak = sum
        setsysvarex("WINDOW_PEAK", peak, 1)
    end
    if sum > 800 then
        sendcentermsg("副本通道当前排队较多,建议错峰进入")
    end
end

验证与监控

模拟 61 分钟连续进入,第 61 分钟的首格旧值被正确滚出,窗口和与手工核对一致;峰值只增不减跨日保留;拥堵提示在 800 阈值上下各触发一次验证。多入口同时计数的并发场景单独压测,计数丢失率要求为零。窗口数据与副本实际进入流水逐分钟比对一刻钟,误差为零才算对齐。监控窗口峰值与实际拥堵投诉的相关性,峰值高但无投诉说明容量还有余量。

踩坑记录

roll 与 add 的先后顺序在分钟边界上出了偏差,先累加后滚动把整分钟计数丢进旧格,先滚动再累加才对齐语义。sum 的减法在槽位为 nil 时把 nil 当数用直接报错,槽位读取必须兜底 0。峰值落盘参数漏给,重启后峰值从零起算,容量预案拿到的历史峰值失真。60 槽语义是最近 60 个整分钟,不是自然小时,跨整点报表与窗口数对不上,口径写进注释与报表脚注。窗口大小从 60 调到 1440 的需求来过,环形结构的优势就是改一个常数,槽位语义要同步改名,别让代码里留着小时字样。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

最新技术文章 · 实战干货

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

玩法策划灵宠捕捉

【玩法策划】灵宠野化:灵宠放归与野外捕捉的玩法设计

实战应用:用在哪里 灵宠养废了只能压仓库,缺一个体面的退出机制。灵宠野化让放归与捕捉形成生态循环:满足条件的灵宠放归野外成为…

2026-09-23 01:55 996 技术组 · 0 阅读
案例复盘挂机数值

【案例复盘】挂机收益失衡的数值回调复盘

实战应用:用在哪里 离线挂机符上线三个月,后台数据出现倒挂:挂机八小时的收益是活跃两小时的 120%,肝帝不如睡帝,活跃玩家…

2026-09-23 01:55 996 技术组 · 0 阅读
运维发布监控分级

【运维发布】监控分级:告警的 P0 到 P3 分级通道设计

实战应用:用在哪里 所有告警都往一个群里发, P0 级的支付故障和 P3 级的日志提醒混在一起,真故障淹没在噪音里。监控分级…

2026-09-23 01:55 996 技术组 · 0 阅读
Lua实战柯里化奖励

【Lua实战】函数柯里化:奖励发放的参数预设

实战应用:用在哪里 活动脚本里到处是 giveitem 加物品名加数量的三行套话,改一个奖励要改五处。柯里化把奖励描述成参数…

2026-09-23 01:55 996 技术组 · 0 阅读
玩法策划行会悬赏

【玩法策划】行会内悬赏:行会成员互助任务的玩法设计

实战应用:用在哪里 行会里总有人缺矿石、缺人带,喊话靠缘分。行会内悬赏把互助做成明码标价的市场:成员发悬赏挂赏金,完成者交任…

2026-09-23 01:55 996 技术组 · 0 阅读
安全加密GM审计

【安全加密】GM 指令审计:高危指令的调用留痕

实战应用:用在哪里 内部人员用 GM 指令给自己发了一枚裁决之杖,事后查不出是谁在什么时候敲的命令。GM 指令审计把高危指令…

2026-09-23 01:55 996 技术组 · 0 阅读