# 多人模拟器改造待开发文档 本文档用于记录“公网模拟器支持多人开发/多人联调”的待开发方案。 当前仅作为设计与排期参考,不代表已经进入实现阶段。 --- ## 1. 目标 当前外部模拟器已经支持: - mock GPS - mock heart rate - 公网 WebSocket 接入 但当前模型更接近“单会话广播”。 如果多人同时开发或联调,容易出现: - A 的 GPS 影响 B 的小程序 - C 的心率影响 D 的 HUD - 同一公网模拟器服务缺乏隔离能力 因此需要把模拟器体系升级成: - 多房间 - 多身份 - 按目标订阅 最终目标是: - 多人共用同一个公网模拟服务 - 各自的数据流互不干扰 - 为未来多人玩法联调留好底座 --- ## 2. 当前问题本质 当前模拟器通信模型更像: - 一个 WebSocket 服务 - 模拟器侧发布消息 - 小程序侧直接接收 这个模型在单人开发时足够。 但在多人开发时,缺少以下维度: - `room` - `actorId` - `channel` 没有这些维度时,服务端无法做消息隔离与路由控制。 --- ## 3. 建议的第一阶段方案 第一阶段不追求复杂功能,只解决“多人不串流”的核心问题。 ### 3.1 核心模型 为所有模拟消息增加 3 个维度: - `room` - `actorId` - `channel` 含义如下: - `room` 表示一个独立测试空间 - `actorId` 表示房间中的一个具体模拟源 - `channel` 表示消息类型,例如 `gps`、`heart_rate` ### 3.2 第一阶段目标 第一阶段完成后应满足: - A 和 B 可以共用同一个公网模拟器服务 - A 的小程序只接 A 的数据 - B 的小程序只接 B 的数据 - GPS 与心率都能隔离 --- ## 4. 推荐协议 ### 4.1 模拟器注册 ```json { "type": "register_simulator", "room": "team-dev", "actorId": "sim-a" } ``` ### 4.2 小程序订阅 ```json { "type": "subscribe", "room": "team-dev", "actorId": "sim-a", "channels": ["gps", "heart_rate"] } ``` ### 4.3 发布 GPS ```json { "type": "publish", "room": "team-dev", "actorId": "sim-a", "channel": "gps", "payload": { "type": "mock_gps", "timestamp": 1711267200000, "lat": 31.2304, "lon": 121.4737, "accuracyMeters": 6, "speedMps": 2.4, "headingDeg": 135 } } ``` ### 4.4 发布心率 ```json { "type": "publish", "room": "team-dev", "actorId": "sim-a", "channel": "heart_rate", "payload": { "type": "mock_heart_rate", "timestamp": 1711267200000, "bpm": 148 } } ``` --- ## 5. 服务端改造建议 ### 5.1 服务端职责 服务端从“直接广播”升级成“按订阅路由”。 它需要维护每个 WebSocket 连接的元数据: ```ts type ClientSession = { socketId: string role: 'simulator' | 'app' room: string | null actorId: string | null channels: Set } ``` ### 5.2 路由规则 服务端收到 `publish` 后,只转发给满足以下条件的客户端: - `role === 'app'` - `room` 一致 - `actorId` 一致 - `channels` 包含当前 `channel` 这一步完成后,多人使用同一个公网服务时就不会互串。 ### 5.3 第一阶段不需要的复杂能力 第一阶段不建议先做: - 房间成员列表 - 在线人数统计 - 历史消息回放 - 房间消息缓存 - 权限控制 这些可以等基础隔离跑通后再扩。 --- ## 6. 小程序侧改造建议 ### 6.1 调试面板新增字段 建议在调试面板中新增: - `Mock Room` - `Mock Actor` - `保存房间/身份` 当前 GPS 和心率已经都有 mock bridge,后续建议最终共用同一个逻辑目标: - 同一个桥接地址 - 同一个 `room` - 同一个 `actorId` ### 6.2 连接流程 小程序连上 mock bridge 后,自动发送: ```json { "type": "subscribe", "room": "...", "actorId": "...", "channels": ["gps", "heart_rate"] } ``` 这样: - GPS 模拟只接自己的 `gps` - 心率模拟只接自己的 `heart_rate` ### 6.3 当前架构适配性 这项改造与当前架构是兼容的。 原因: - 它主要发生在传感层和调试链 - 不需要改规则层 - 不需要改 telemetry 语义 - 不需要改地图引擎主逻辑 --- ## 7. 外部模拟器改造建议 ### 7.1 第一阶段 UI 最小改动 模拟器左侧面板新增两个输入项: - `Room` - `Actor ID` 后续所有 GPS / 心率发送都自动带上它们。 ### 7.2 推荐默认使用方式 多人开发时建议: - 大家共用同一个公网服务地址 - `room` 用项目或阶段名 - `actorId` 用开发者自己名字或实例名 示例: - room: `team-dev` - actorId: `zhangsan` - actorId: `lisi` ### 7.3 后续可扩展能力 后续如果要继续增强,可以加: - 房间成员列表 - 一键复制当前房间配置 - 旁观模式 - 同房间多个 actor 同时显示 - 共享路径模板 --- ## 8. 为什么这项改造值得做 这不只是为了多人开发方便。 它还会直接为未来这些方向打基础: - 多人玩法联调 - 团队对抗玩法 - 领地争夺玩法 - 多角色追逐玩法 也就是说: 今天为“多人模拟器”加的 `room + actorId + channel`,未来可以直接演进成多人玩法调试底座。 --- ## 9. 建议实施顺序 ### 第一阶段 - 服务端支持 `register_simulator / subscribe / publish` - 消息带 `room + actorId + channel` - 小程序支持订阅指定 `room + actorId` - 外部模拟器增加 `room / actorId` ### 第二阶段 - 增加房间成员列表 - 增加在线状态 - 增加多 actor 可视化 ### 第三阶段 - 接多人玩法联调 - 接角色维度 - 接会话回放与共享调试 --- ## 10. 第一阶段验收标准 第一阶段完成后,至少应满足: 1. 两个人同时连同一个公网模拟器服务,不串 GPS 2. 两个人同时连同一个公网模拟器服务,不串心率 3. 同一个房间中,不同 `actorId` 可以隔离 4. 一个小程序实例可以只接收自己配置的目标流 --- ## 11. 当前结论 这项改造建议先保留为待开发事项。 当前阶段不急着实现,但应作为后续多人开发与多人玩法联调的重要底座能力。