CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
网络通信合并打包

【网络通信】消息合并:同帧多包的打包下发

2026-09-23 00:25 作者:996 技术组 0 阅读 996引擎Lua教程传奇脚本网络通信合并打包

实战应用:用在哪里

拍卖行竞拍高峰,一件屠龙刀 1 秒能产生 60 条竞价事件,逐条 sendluamsg 下发,竞拍面板每秒重建 60 次,低端机直接卡死。消息合并把同一玩家的多条事件收进 1 秒窗口,打包成一条消息下发,回调次数降到百分之一。合并的收益在客户端侧最明显:回调次数、界面重建次数、GC 压力三项同步下降,低端机卡顿帧比例从两成降到 3% 以内。合并对发起方同样友好,下行包量降到原来的 2%,网关带宽压力同步缓解。

窗口聚合的缓冲结构

每个玩家一条缓冲队列,事件先入队,全局定时器每 1 秒统一打包,用换行符拼接后单次下发,队列即发即清。

lua
local W = {}
function pushAuction(actor, txt)
    local q = W[actor] or {}
    table.insert(q, txt)
    W[actor] = q
end
setontimerex(134, 1)
function ontimer134()
    for actor, q in pairs(W) do
        if #q > 0 then
            sendluamsg(actor, 7002, 0, 0, 0, table.concat(q, "\n"))
            W[actor] = {}
        end
    end
end

折叠上限与离线清理

窗口内超过 40 条折叠成摘要,避免单包过大;离线玩家的残留队列每 60 秒清一轮,缓冲表不无限膨胀。

lua
local LIMIT = 40
function pushAuction(actor, txt)
    local q = W[actor] or {}
    if #q >= LIMIT then
        q[LIMIT] = "另有更多竞价已折叠"
    else
        table.insert(q, txt)
    end
    W[actor] = q
end
setontimerex(135, 60)
function ontimer135()
    for actor, q in pairs(W) do
        local p = getplayerbyname(actor)
        if not (p and isplayer(p)) and #q > 0 then
            W[actor] = nil
        end
    end
end

验证与监控

压测 60 条每秒注入单玩家队列,核对客户端回调次数从 60 降到 1;41 条事件核对第 40 条被摘要折叠;下线玩家的残留队列 60 秒内清除。多玩家并发场景抽 10 个账号交叉注入,核对各自队列互不串包。监控单包字节量与折叠触发次数,折叠率长期高于两成说明窗口该缩短。单包体积上限 8KB 校验,超限提前分片下发,不靠折叠文案硬扛。

踩坑记录

合并包用换行拼接,客户端按行拆分时漏了末行没有换行符的情况,末条竞价显示丢失,拼接改成行间插入、首尾不加。事件顺序按入队顺序天然保序,但折叠后序号会跳,客户端进度条按序号推进而错位,改成按条数推进。离线清理遍历的是玩家名键,重名改名窗口期出现误判,清理动作改成只清队列非空的键并二次校验。合并窗口 1 秒是引擎定时器的粒度下限,想要 200 毫秒窗口的方案在网关层做,引擎侧做不了。合并包为空时 sendluamsg 的变参被引擎裁参报参数不足,空队列跳过发送的判断补在定时器入口。

作者履历与出处

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

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

最新技术文章 · 实战干货

LATEST ARTICLES

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

案例复盘首杀归属

【案例复盘】BOSS 首杀归属争议的仲裁复盘

实战应用:用在哪里 祖玛教主全服首杀出了大事:行会 A 磨掉九成血,行会 B 赶来收下终结一击,系统按击杀者把首杀公告给了 …

2026-09-23 00:53 996 技术组 · 0 阅读
后端接口红名洗白

【后端接口】红名洗白:洗红任务的进度接口实现

实战应用:用在哪里 PK 值 200 以上进红名村,出来靠洗红任务:击杀红名村恶徒掉善恶令,红名村老者按每枚减 10 点 P…

2026-09-23 00:53 996 技术组 · 0 阅读
界面UI技能栏交互

【界面UI】技能槽位交换:图标选中与槽位互换的界面实现

实战应用:用在哪里 烈火剑法常年压在 8 号槽,手指够不着,想换到 2 号槽。技能栏交互做两次点击交换:点源槽高亮选中,点目…

2026-09-23 00:53 996 技术组 · 0 阅读
玩法策划藏宝探索

【玩法策划】藏宝罗盘:全服藏宝点指引的玩法设计

实战应用:用在哪里 玩家对固定地图刷腻了,缺一个全服一起动的探索玩法。藏宝罗盘每天 8 点在全服刷 3 个藏宝点,罗盘道具指…

2026-09-23 00:53 996 技术组 · 0 阅读
玩法策划经济物价

【玩法策划】物价平准:系统商店物价调节的玩法设计

实战应用:用在哪里 商人号每天从系统商店搬 5 万瓶金创药去摆摊倒卖,药品市场翻着倍涨。物价平准机制让系统商店的畅销品随全服…

2026-09-23 00:53 996 技术组 · 0 阅读
数据存储对账日结

【数据存储】日结对账:跨天结算数据的对账流程

实战应用:用在哪里 经济类投诉最怕说不清:玩家说商店多扣了钱,运营翻不出账。日结对账把发放侧与消耗侧各立一个计数器,全天累加…

2026-09-23 00:53 996 技术组 · 0 阅读