1作者: yaoke2592 个月前原帖
我正在开发一款多人赛车游戏,但不断遇到相同的问题。状态不同步,导致玩家看到不同的位置;当两个玩家与同一个物体互动时出现竞争条件。这些都是常见的问题。 令人沮丧的是,这些错误只在多个真实玩家的情况下出现。在本地无法重现这些问题,无法轻松测试修复,而添加日志会改变时序,导致错误消失。 在不同项目中第三次重建网络代码后,我注意到一个问题:大多数多人游戏的错误源于对网络的思考,而不是游戏逻辑。 ## 方法 在单人游戏中,你只需写: ```typescript player.x += velocity.x; player.health -= 10; ``` 因此,我构建了 martini-kit,使多人游戏以相同的方式工作: ```typescript const game = defineGame({ setup: ({ playerIds }) => ({ players: Object.fromEntries( playerIds.map(id => [id, { x: 100, y: 100, health: 100 }]) ) }), actions: { move: (state, { playerId, dx, dy }) => { state.players[playerId].x += dx; state.players[playerId].y += dy; } } }); ``` 就这样。没有 WebSockets,没有序列化,没有消息处理程序。martini-kit 自动处理状态同步、冲突解决、连接管理和消息排序。 ## 工作原理 与其考虑消息,不如考虑状态变化: 1. 定义纯函数以转换状态 2. 一个客户端是“主机”,并运行权威的游戏循环 3. 主机广播状态差异(带宽优化) 4. 客户端修补其本地状态 5. 冲突默认为主机权威(可定制) 在这种模型下,竞争条件和排序错误在结构上是不可能的。 ## 适用场景 - 回合制游戏、平台游戏、赛车游戏、合作游戏:效果良好 - 60Hz 刷新率的快节奏 FPS:尚不理想 - 包含 Phaser 适配器,Unity/Godot 适配器正在开发中 - 支持 P2P(WebRTC)或客户端-服务器(WebSocket) - 可以与 Colyseus/Nakama 等进行匹配和身份验证集成 ## 尝试一下 [互动演示](https://martini.blueprintlab.io/preview) - 在浏览器中即时测试多人游戏 或者安装: ```bash npm install @martini-kit/core @martini-kit/phaser phaser ``` 链接: - 网站: [https://martini.blueprintlab.io/](https://martini.blueprintlab.io/) - 文档: [https://martini.blueprintlab.io/docs](https://martini.blueprintlab.io/docs) - GitHub: [https://github.com/BlueprintLabIO/martini](https://github.com/BlueprintLabIO/martini) - npm: [https://www.npmjs.com/package/@martini-kit/core](https://www.npmjs.com/package/@martini-kit/core) 欢迎反馈,也想知道是否有其他人遇到过类似的多人状态管理问题。
2作者: novoreorx2 个月前原帖
今天在忙于工作时使用 iTerm2,我再次感到沮丧,因为标签页太多,导致无法整体把握正在进行的任务。因此,我使用了 v0 + Opus 4.5 来构思一个理想的终端标签管理用户界面,以展示我管理终端标签的最佳方式。你觉得怎么样?