协议优化与带宽控制
概述
带宽是移动游戏的稀缺资源:弱网环境下,协议大小直接决定流畅度。协议优化的目标是更小的消息 + 更少的发送次数,带宽控制则保证关键消息优先、非关键可牺牲。本文介绍消息压缩、字段精简、批量聚合与上下行流量控制。
一、消息体压缩
1.1 压缩算法对比
| 算法 | 压缩率 | 速度 | 适用 |
|---|---|---|---|
| LZ4 | 中 | 极快 | 实时消息(默认推荐) |
| Snappy | 中 | 快 | 通用默认 |
| Zstd | 高 | 较快 | 大消息/可压缩 |
选型逻辑:
实时小消息 → LZ4(延迟优先)
大消息(公告/配置)→ Zstd(压缩率高)
压缩阈值:小于阈值不压(压缩本身有开销)
// 按消息大小决定是否压缩
if (msgSize > COMPRESS_THRESHOLD) {
payload = compress(msg); // LZ4/Zstd
}1.2 压缩实践
压缩位置:
网关编解码层(透明压缩)
或业务层(特定大消息)
注意:
压缩与解压开销(CPU)
压缩结果带标志位(协议头标记 compressed)
压缩前评估收益(小消息压缩反而变大)// 协议头扩展:压缩标志
Header: magic(2) + version(1) + flags(1) + opcode(2) + length(4)
flags bit0 = 压缩标志(1 表示 body 已压缩)二、协议字段精简
2.1 精简原则
字段精简方向:
二进制优于文本(Protobuf 优于 JSON)
变长编码(Varint 小整数)
字段复用(状态用枚举/位图)
省略默认值(Protobuf 默认字段不传)
// Protobuf 优势(见协议选型章节)
// 整型 Varint 编码:小值占 1 字节精简示例:
数字 ID → 变长整型
状态码 → 单字节枚举
坐标 → 定点数压缩
时间 → 秒级差值(相对时间)
重复数据 → 差值编码(增量)2.2 精简实践
常见浪费:
完整时间戳(8 字节)→ 秒级差值/相对时间
长字符串 → 字典表(ID 映射)
浮点 → 定点/半精度
未使用字段 → 删减
权衡:
精简带来编解码复杂度
只在带宽紧张/高频消息上投入
对局高频消息重点优化三、批量消息聚合发送
3.1 聚合原理
批量聚合:
多条小消息合并成一条发送(一次网络包)
减少发送次数(减少系统调用与头部开销)
适用:
高频小消息(对局状态/移动同步)
广播场景(房间内状态推送)
// 房间状态批量推送(攒批 flush)
List<Msg> batch = bufferedMessages.pollAll();
ctx.writeAndFlush(batch); // 一次写出3.2 聚合实现
聚合策略:
时间窗聚合(如 50ms 攒一批)
数量上限(攒够 N 条即发)
紧急消息直发(不等待聚合)
// 时间窗批量发送示例
channel.eventLoop().scheduleAtFixedRate(() -> {
List<Msg> batch = outQueue.drainTo();
if (!batch.isEmpty()) {
channel.writeAndFlush(batch);
}
}, 0, 50, TimeUnit.MILLISECONDS);聚合注意:
延迟权衡(聚合引入缓冲延迟)
对局关键消息不可延迟(直发)
广播聚合是主要收益点四、上下行流量控制
4.1 流量分级
消息优先级:
P0 关键(对局操作/结算)→ 必达、低延迟
P1 重要(活动通知/交易)→ 正常
P2 普通(聊天/播报)→ 可延迟可丢弃
流量控制:
下行限速(慢客户端保护)
高峰降级(非关键消息降频/丢弃)
// 下行队列按优先级处理
if (queueDepth > LIMIT) {
dropLowPriority(queue); // 丢弃 P2 消息
}4.2 上行控制
上行保护:
客户端频率限制(网关/逻辑层)
防刷接口(见聊天限流/行为验证)
大流量客户端降级(暂停非必要消息)
下行带宽预估:
单玩家 10KB/s × 1 万在线 = 100MB/s 下行
峰值规划(见压测章节)网络状况适配:
弱网客户端 → 降低推送频率
状态同步 → 降采样(见状态同步章节)
帧同步 → 输入压缩/缓冲五、实现要点
优化清单:
压缩(LZ4 实时 / Zstd 大消息,带阈值)
字段精简(二进制/变长/复用)
批量聚合(时间窗 + 数量上限)
流量分级(P0 必达、P2 可丢)
上行限频、下行限速
弱网适配
常见坑:
小消息压缩反而变大 → 阈值判断
聚合延迟影响对局 → 关键消息直发
无限聚合积压 → 数量上限 + 超时
无差别丢消息 → 优先级分级与其他系统衔接:
协议设计 → 协议选型/编解码章节
广播 → 消息同步章节
弱网 → 帧同步/状态同步章节
压测 → 压测章节(带宽指标)