很多人觉得 SLG 后端就是写写 CRUD增删改查点个建筑升级嘛数据库改个时间不就行了兄弟图样图森破。当你面对 “十万部队同时围攻名城且必须在 0.1 秒内算出谁先补了最后一下刀” 的时候你就会发现Go 语言给你的并发自由全是带代价的。刚进组时玩家行军 5 分钟我就写了一个time.AfterFunc(5 * time.Minute, arriveFunc)。结果策划搞了个全服“名城争霸”活动几万个部队同时出发。 后台 Goroutine 数量像窜天猴一样往上涨GC垃圾回收开始疯狂抖动服务器卡爆了。后来我学乖了搞了个 “时间轮”。简单说就是像个旋转寿司台把任务按时间挂在格子上转到哪格处理哪个。永远不要相信原生 Timer 能承载你的 SLG 梦想除非你的梦想里只有十个玩家。SLG 的大地图是一个巨大的“共享资源”。玩家 A 占领土地的同时玩家 B 的行军刚好经过玩家 C 正在侦察。如果给整张地图加一个sync.Mutex那恭喜你你的服务器将获得“绝对的公平”——所有人一起卡死。 我们现在的做法是 “格子锁” 或者 “区域锁”。把大地图切成小块你打你的我跑我的。吐槽一下写 Go 一年我最大的感悟不是Channel多好用而是如何优雅地不被死锁Deadlock憋死。现在最爽的是你可以看着自己写的代码处理成千上万的逻辑最怕的是第二天早上看到群里的“英雄归零”报警。