多人游戏状态的增量编码:快照之外,按"事实"下发补丁
来源:dev.to — 2026-09-01
📋 概述
作者介绍浏览器策略游戏 Old Light 如何用增量编码在服务器与上千个客户端间同步完整星系状态:连接时发一份快照,之后每次变更以 world.delta 补丁形式下发。与常见的字节级 diff 不同,这里按"事实"(玩家、星区、交易板、谈判)建模,绝对值为王而非增量——补丁幂等,重复投递落在同一状态,漏掉的也能被下一条完整修复。同一事件对不同观众生成不同补丁:公开版本经 scrub 函数按白名单剥离私有字段,谈判消息只推送给当事双方。
🔑 核心要点
- 客户端持有完整星系状态副本,连接时快照、变更时按 world.delta 补丁合并
- 不采用字节 diff,因为对上千 socket 维护"最后已知状态"的成本高于更新本身
- 增量里每个值都是新总量(绝对而非增量),使补丁幂等且可安全重放
- 公开补丁经 scrub 白名单剥离经济、舰队等私有字段,私有版本只发给本人
- undefined 表示"未发送"而非"已清除",防止薄版本把玩家自己的帝国从屏幕上抹掉
- dirtySectors 只发失效信号,让客户端按需重拉,把补丁保持在几百字节
💡 金句
说"增量编码",人们通常指的是字节差异——但这里下发的其实是关于玩家和星区的事实。
👍 0
👎 0
← 返回 dev.to 首页