问题现象
当前 mod 可以通过配置将联机房间人数上限提高到 16。
实际测试中,8 人可以进入游戏,但在进入游戏或大厅同步过程中,会稳定出现部分玩家丢失连接的问题,例如 8 人时固定有 3 名玩家断连。
这说明房间容量本身已经被提高,但部分官方网络消息在 8 人规模下仍可能存在序列化位宽不足的问题,导致客户端之间的同步数据不一致,最终表现为部分玩家断连。
初步分析
原版部分 Lobby 消息仍然使用 3 bits 来序列化玩家列表长度。
3 bits 可以表达的范围是 0-7。
需要注意的是,第 8 个玩家的 slotId 是 7,确实可以被 3 bits 表达;但大厅玩家列表长度会变成 8。
玩家列表长度是数量,不是从 0 开始的槽位下标,因此:
- 7 人时,列表长度是 7,可以被 3 bits 表达
- 8 人时,列表长度是 8,已经超出 3 bits 的表达范围
如果某个 Lobby 同步消息仍然使用 3 bits 读写玩家列表长度,就可能导致网络包序列化/反序列化异常或数据错位,从而造成部分客户端断连。
预期修复方向
将官方 Lobby 消息中的玩家列表长度序列化从 3 bits 扩展到更大的位宽,并尽量覆盖所有官方 Lobby 消息,而不是只 patch 少数已知消息。
问题现象
当前 mod 可以通过配置将联机房间人数上限提高到 16。
实际测试中,8 人可以进入游戏,但在进入游戏或大厅同步过程中,会稳定出现部分玩家丢失连接的问题,例如 8 人时固定有 3 名玩家断连。
这说明房间容量本身已经被提高,但部分官方网络消息在 8 人规模下仍可能存在序列化位宽不足的问题,导致客户端之间的同步数据不一致,最终表现为部分玩家断连。
初步分析
原版部分 Lobby 消息仍然使用 3 bits 来序列化玩家列表长度。
3 bits 可以表达的范围是 0-7。
需要注意的是,第 8 个玩家的 slotId 是 7,确实可以被 3 bits 表达;但大厅玩家列表长度会变成 8。
玩家列表长度是数量,不是从 0 开始的槽位下标,因此:
如果某个 Lobby 同步消息仍然使用 3 bits 读写玩家列表长度,就可能导致网络包序列化/反序列化异常或数据错位,从而造成部分客户端断连。
预期修复方向
将官方 Lobby 消息中的玩家列表长度序列化从 3 bits 扩展到更大的位宽,并尽量覆盖所有官方 Lobby 消息,而不是只 patch 少数已知消息。