主要观点:介绍了“One Million Chessboards”这款游戏的工作原理、系统设计目标、架构、数据分发、状态存储、回滚机制等方面,探讨了在开发过程中遇到的问题及解决方案,还分析了游戏的优缺点及后续改进方向。
关键信息:
- 是 1000x1000 的棋盘网格,移动棋子对所有人即时生效,无回合制,棋子可在棋盘间移动。
- 设计目标包括最小化带宽、单进程运行、瓶颈为系统调用或消息序列化开销、速度快。
- 基本架构包括单 golang 进程服务器、nginx 反向代理、cloudflare 等,有 4 个核心组件。
- 数据通过快照和移动批次分发,基于玩家位置发送,使用 protobufs 压缩。
- 状态存储为 8000x8000 的数组,用 mutex 保护,通过 go 通道处理移动。
- 采用乐观即时应用移动的“回滚”机制处理网络延迟。
重要细节: - 规则方面,棋子可在棋盘间移动,无回合制,防止跨棋盘捕获等,这些规则曾导致游戏锁定,后有所调整。
- 系统设计中,为减少带宽选择单进程运行,各组件如 board、client manager 等各司其职。
- 数据分发时,根据玩家位置发送快照和移动批次,通过 websockets 传输,考虑过用 UDP 但未采用。
- 状态存储时,用 6400 万元素数组,通过复制数组到磁盘避免锁死,处理快照时通过后处理剔除空棋子以减少锁持时间。
- 回滚机制中,区分地面真相和乐观跟踪状态,处理冲突时回滚相关移动,用依赖图管理移动关系。
- 开发过程中,起初数学计算错误,后改为单 mutex 方案,还通过 profiling 优化代码和测量带宽等。
- 游戏存在一些问题,如颜色分配混淆、跨棋盘规则难懂等,作者意识到设计决策应更注重游戏乐趣等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。