网络代码陷阱:悄悄消失的消息
多人游戏的 bug 自成一类:没有崩溃,没有错误日志——就是什么都没发生。下面是我们自己网络代码里最喜欢的两个陷阱,既是警示,也供大家一乐。
陷阱一:没注册的消息。我们的网络协议认识各种消息类:“方块变化”“玩家移动”“聊天”。每一种新的消息类型都必须在编解码器里注册,这样它才有 ID、才能被序列化。忘了这一步,就会发生最糟糕的事:发送调用失败了,但错误恰好被悄悄吞掉。没有崩溃,没有日志——这个功能就是“不工作”。我们为此调试过不止一次,直到养成了条件反射:新建了消息类?先问一句:注册了吗?
陷阱二:幽灵方块。当服务器改变一个方块时——比如某个脚本正在重塑地形——它必须主动通知所有已连接的玩家。忘了广播,就会出现幽灵方块:服务器知道那里有个方块,客户端却显示空气。玩家会撞上一堵看不见的墙——或者更糟,在服务器那边已经不存在的位置上建造。只有重新加载这个区块,两个世界才会重新对齐。
共同点是:在多人游戏里永远有两个“真相”——服务器的和客户端的——而每一个必须让两者保持同步的地方,都是潜在的陷阱。我们的应对办法是编写专门检查这种同步的测试,并为新消息准备检查清单。不起眼,但从那以后,幽灵就少见多了。
留言