模拟游戏延迟和丢包
网络代码是在 ping 只有 1 ms 的本地连接上写的,却由酒店 Wi-Fi 上的玩家来测试。本工具在你自己的机器上弥合这一差距,只针对游戏进程,电脑的其余部分仍可正常使用。
从这里开始
瞄准游戏客户端,给它一个真实的糟糕连接,并让它在五分钟后自行停止:
BeanNetworkTester.exe --latency 120 --jitter 60 --loss 3 --target mygame.exe --duration 300
这方面也有现成的时间线:scenarios 文件夹里的 overloaded-game-server.json 会让连接陷入拥塞再恢复,你可以看到客户端如何应对这两个方向的变化。参见定时场景。
为什么游戏会出现丢包,而浏览器不会
大多数游戏流量是 UDP,而 UDP 没有任何东西可以用来掩盖丢包。通过 TCP 加载网页时会悄悄重传,只是花的时间更长,这就是为什么 5% 丢包时浏览器可能感觉还行,而同样 5% 的一局游戏却会卡顿、回拉并且失去同步。
这使游戏成为测试丢包最诚实的地方:你设置的,就是客户端实际经历的。
该设置什么,它能检验什么
| 设置 | 建议值 | 它暴露什么问题 |
|---|---|---|
| 延迟 | 80 到 250 ms | 预测与插值。开枪之后你的角色会被拉回去吗? |
| 抖动 | 40 到 100 ms | 缓冲。稳定的 200 ms 比不断变化的 ping 更容易掩盖。 |
| 丢包 | 2% 到 10% | 缺失的状态更新,以及客户端是能恢复还是会逐渐偏离。 |
| 尖峰 | 偶尔出现的 1 秒 | 基站切换造成的停顿。通常是最难看的一种。 |
| 链路时通时断 | 10 秒周期,30% 时间中断 | 重连与重新加入。 |
衡量抖动时,请看第 95 百分位与中位数之间的差距,而不是平均值:抖动几乎不会改变平均值,这就是为什么一次运行在纸面上看起来相同,玩起来却不一样。
比较两个版本需要随机种子
随机丢包会让两次运行不同,所以“新版本感觉更差”并不是证据。同一个随机种子会重放同样的丢包和同样的抖动,把一种感觉变成一次对比:
BeanNetworkTester.exe --latency 120 --jitter 60 --loss 5 --seed 42 --target mygame.exe --duration 180
它做不到什么
它塑造的是你的机器的流量。它不会让服务器变慢,不会改变服务器的 tick 速率,也不会让其他玩家处于糟糕的连接中,所以它测试的是你的客户端面对糟糕链路的表现,而不是你的服务器在负载下的表现。服务器端需要的是负载测试,而要让整个大厅都是糟糕的连接,你需要不止一台机器。