跳到主要内容

服务端快照与接收者

S2C 数据用于重建客户端展示。一次快照应足够让新加入的客户端理解当前状态,不应要求它已经收到之前所有事件。

从展示需求选择字段

比分 HUD 需要地图身份、比分和阶段;它不需要完整 BaseMap、队伍玩家实体或回合规则。传输小型不可变值,能使界面与服务器实现分别演进。

教程的 ScoreS2CPacket 就是一个 Java record,完整编码和接收实现见第八章

选择接收者

附属模组独立频道可以这样向一位玩家发送:

EliminationNetwork.PACKETS.getChannel().send(
PacketDistributor.PLAYER.with(() -> player), packet);

playerServerPlayerpacket 必须已注册在这个频道上。群发时先取得需要接收的玩家集合。比分通常包含观察者;私有商店、队伍战术信息则只发给有权接收的人。

FPSMatch 的 BaseMap.sendPacketToAllPlayer 等工具使用框架频道。独立频道注册的包应通过自己的频道发送,避免出现消息未注册错误。

初始与增量同步

进入房间、加入地图和重连时发送完整快照。后续可以只在分数、阶段或设置发生变化时发送。脏标记表示“尚未广播的变化”,不应被给单个新玩家的初始快照清除。

倒计时可以发送服务器确定的阶段信息与时间基准,由客户端做视觉插值。客户端预测只影响显示,超时胜负仍由服务器判断。

离场与旧数据

客户端退出地图或断开连接时,应清理旧快照。多个地图使用相同 HUD 时,最好同时携带游戏类型和地图 ID,并在换图时替换状态。

教程采用周期全量快照和两秒失效时间,便于理解整个链路;需要即时切换的产品界面可增加明确的加入、离场或订阅消息。

协议变化

编码和解码字段顺序必须一致。更改字段类型、删除字段或调整顺序时更新协议版本。新增字段也不是天然兼容,应定义旧客户端读取方式或拒绝不支持的协议版本。