本文档用于记录“公网模拟器支持多人开发/多人联调”的待开发方案。
当前仅作为设计与排期参考,不代表已经进入实现阶段。
当前外部模拟器已经支持:
但当前模型更接近“单会话广播”。
如果多人同时开发或联调,容易出现:
因此需要把模拟器体系升级成:
最终目标是:
当前模拟器通信模型更像:
这个模型在单人开发时足够。
但在多人开发时,缺少以下维度:
roomactorIdchannel没有这些维度时,服务端无法做消息隔离与路由控制。
第一阶段不追求复杂功能,只解决“多人不串流”的核心问题。
为所有模拟消息增加 3 个维度:
roomactorIdchannel含义如下:
room
表示一个独立测试空间actorId
表示房间中的一个具体模拟源channel
表示消息类型,例如 gps、heart_rate第一阶段完成后应满足:
{
"type": "register_simulator",
"room": "team-dev",
"actorId": "sim-a"
}
{
"type": "subscribe",
"room": "team-dev",
"actorId": "sim-a",
"channels": ["gps", "heart_rate"]
}
{
"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
}
}
{
"type": "publish",
"room": "team-dev",
"actorId": "sim-a",
"channel": "heart_rate",
"payload": {
"type": "mock_heart_rate",
"timestamp": 1711267200000,
"bpm": 148
}
}
服务端从“直接广播”升级成“按订阅路由”。
它需要维护每个 WebSocket 连接的元数据:
type ClientSession = {
socketId: string
role: 'simulator' | 'app'
room: string | null
actorId: string | null
channels: Set<string>
}
服务端收到 publish 后,只转发给满足以下条件的客户端:
role === 'app'room 一致actorId 一致channels 包含当前 channel这一步完成后,多人使用同一个公网服务时就不会互串。
第一阶段不建议先做:
这些可以等基础隔离跑通后再扩。
建议在调试面板中新增:
Mock RoomMock Actor保存房间/身份当前 GPS 和心率已经都有 mock bridge,后续建议最终共用同一个逻辑目标:
roomactorId小程序连上 mock bridge 后,自动发送:
{
"type": "subscribe",
"room": "...",
"actorId": "...",
"channels": ["gps", "heart_rate"]
}
这样:
gpsheart_rate这项改造与当前架构是兼容的。
原因:
模拟器左侧面板新增两个输入项:
RoomActor ID后续所有 GPS / 心率发送都自动带上它们。
多人开发时建议:
room 用项目或阶段名actorId 用开发者自己名字或实例名示例:
team-devzhangsanlisi后续如果要继续增强,可以加:
这不只是为了多人开发方便。
它还会直接为未来这些方向打基础:
也就是说:
今天为“多人模拟器”加的 room + actorId + channel,未来可以直接演进成多人玩法调试底座。
register_simulator / subscribe / publishroom + actorId + channelroom + actorIdroom / actorId第一阶段完成后,至少应满足:
actorId 可以隔离这项改造建议先保留为待开发事项。
当前阶段不急着实现,但应作为后续多人开发与多人玩法联调的重要底座能力。