生命在于折腾——记一次不断倒腾让 CS:GO 流畅运行的经历

22 分钟读完

2021年1月12日原文

故事得从我初中开始说起(大概是 2008-09 年左右),在我中预、初一的时候我被一款 FPS 游戏所吸引,当时寒暑假里我的大部分时间都被这个游戏所占据,可以说当时的我对于这款游戏的热爱已经到了近乎疯狂的地步。半夜里会偷偷设置闹钟起床,为了不被父母发现带着耳机去玩;放学后会为了能赶在父母下班回家之前多玩一会儿而打车回家;初中电脑课上在学校电脑里偷偷安装这个游戏,最后被叫家长。可以说这款游戏贯穿了我的初中时代,这款游戏就是“穿越火线”。我喜欢这款游戏,主要因为它很耐玩,就像 Kiki 喜欢英雄无敌6一样,不过不同的是穿越火线是一个联机游戏,在不同玩家的线上竞争中也增加了游戏的趣味性。当年的游戏中有很多不氪金的高手,他们往往拿着最朴素的黑色武器但却凭借着超高的技艺大杀四方。自从火麒麟问世之后的穿越火线就开始走下坡路了,在我大一暑假期间还玩过一阵子,不过早已经没了当时的乐趣。

昨天逛知乎发现社区里还有不少和我类似的老玩家,读了其中一篇回答,真的深有同感,这里摘录一些我仍然记忆犹新的片段,以下引用自 @90ago 的回答:(穿越火线为什么走下坡路了?请从多个方面详细点的说说好么 - 90ago的回答 - 知乎

当时,人们很愿意充一个qq会员,领取一把红色的会员消音m4。

沙漠灰,躲在后花园,拿着一把ak狙,换子弹速度快,对面人一来,4杀,战斗结束。

记得,那时,沙漠灰,b点,有个bug可以安包进去。(我在补充一下:好像是跳到箱子的角上然后按包,如果你的位置不是太靠近角上,包就会卡到箱子里区,最后即使 T 全被杀光,菜鸟 CT 来找包的话就就会浪费很多时间,提高 T 方的胜率)

我爱当个人英雄。沙漠灰,最后1v4,我,普通m4。小道杀一个,掉了个m4瞄准镜枪,老子不捡!出去,中门,又一个。上楼梯,一个人在那捡枪,又一个。掉包,躲着,队友文字提醒我人走了。进B,扔个闪光,打,又一个,拆包。完美结束,爽。

总之满满的都是回忆,CF 在引入氪金武器之后就大大减少了我们这个不怎么氪金玩家们的游戏乐趣,后来我也就慢慢的也弃坑了,但是我因为它而喜欢上了 FPS 游戏,最近疫情期间我正好有一些空余时间,于是就想试试 CS:GO,消遣消遣,找找当年的感觉,没想到 CS:GO 的优化似乎不如穿越火线,花了好久才最终使其流畅运行。

CS:GO 是 Steam 游戏平台上的一款免费游戏,我觉得与穿越火线最大区别就是

  1. 每局战斗开始之前买装备
  2. 游戏手感很不同,可能更接近现实?
  3. 画质更好,游戏更加平衡

上周的某一天下班之后,我兴致勃勃地打开 Steam 把 CS:GO 添加到我的 library 里面,然后下载等待其安装完成。过了15分钟左右,我打开游戏,在 intro 的动画播放时我就隐约感觉到卡顿,然后我直接打开了一局游戏,发现帧数很低,转动视角有明显卡顿,估计当时帧数大概在 30 FPS 以下,于是我把画质光效什么的调到最低,发现帧数略微哟一些提高,可能到 40 FPS 左右,不过比起之前穿越火线的丝滑手感,这个我显然是无法接受的。不过这个也是意料之中的,因为我电脑里只有 7700K 的 Intel® HD Graphics 630 集成显卡,CS:GO 需要比这个集显3D图形渲染能力更强一些的显卡。

既然在自己现有的电脑上跑不起来,我忽然想到 Kiki 有一台 2015 年顶配的 15 吋 MBP,搭载了 Radeon R9 M370X 独立显卡,于是乎我立刻在 MacOS 上装好了 Steam,下载游戏,打开……结果非常失望,调用 OpenGL 接口的 CS:GO 比我台式机集显还要卡,我去……

Ok, 我又思忖了一下,好像最近云游戏(Cloud Gaming)挺火的,于是乎说干就干,查了很多 reddit 的攻略,决定使用 Amazon EC2 G4 Instances + Parsec 这个组合实现,感谢 @jamesstringerparsec 提供的 Windows 下一键环境部署工具,一番折腾后终于可以跑起来了,我在台式机上装好 Parsec 客户端,然后连接远端的 EC2 服务器,下载 Steam 安装游戏。打开游戏后第一感觉是比本地要流畅不少,画质可能由于压缩原因还是牺牲了一些。然后我打开一局游戏玩了一会儿,发现一个很奇怪的 bug,差不多玩 5-10 秒就会卡一下,我根据官网的 Troubleshooting Lag, Latency and Quality Issues 指南查了一下,没有发现任何问题 Decode and Encode 延迟都正常,网络带宽还有很多的富余,网络延迟也是小于 40 ms 的。我后续又尝试了魔改各种参数,各种排列组合,包括英伟达控制面板,始终都没法解决这个问题。最后我又尝试了把 OS 换到 Windows Server 2016 以及 Azure 平台的 NV6 Tesla M60 显卡,问题依旧。如果在阅读这篇文章的你解决了这个问题,一定要告诉我哈! 已解决,见最终的问题解决办法

你觉得我会就此罢休?我这个人一折腾就停不下来了,在尝试了台式机集显,MBP 独显以及云游戏后我决定购买我人生中的第一张正版显卡(对的你没有看错,之前在国内因为图便宜在X宝买了一张盗版的 GTX 显卡)。直接上图:

MSI Gaming Radeon RX 570 256-bit 8GB GDRR5 DirectX 12 VR Ready CFX Graphcis Card (RX 570 Armor 8G OC)

亚马逊的快递很给力,两三天就送到了。拿到显卡之后我就立马给我的 ROG STRIX Z270E 主板装上了,开机直接点亮,打上驱动,非常顺利,熟练地打开 Steam launch game,与预想的差不多,画质高了不少,打一局游戏看看?我的天,这次又是另外一种卡顿,就是你明明已经走到前面,但是又瞬移回来了。妈蛋……玩个游戏怎么那么费劲,没办法,只能上网搜搜,希望能有解决方法。经过一顿搜索,我觉得问题有很大概率出在我的网络上,于是在 reddit 网友们的推荐下,我用 net_graph 1 命令打开了游戏画面以及网络状态详细参数的显示,发现 loss 和 choke 一直都是 0,换句话说就是 UDP 没有任何丢包的迹象,延迟一直维持在 30-50 ms 的区间。虽然这里显示没有丢包,我仍然怀疑是网络问题,于是我在里多伦多最近的 Azure 数据中心的 Canada Central 区用这个脚本搭建了一个 IPsec VPN,我到 VPN 服务器的延迟大约在 15-20 ms 左右(P.S. 由于 FPS 游戏对于延迟非常敏感,尽量连接物理距离短的服务器)。搭好 VPN 之后,我用 Windows 自带的客户端连接了这个 VPN:

Azure VPN

然后开了一局游戏,奇迹发生了!卡顿消失了!!!终于可以愉快地游戏了,这年头玩个游戏都要会点 Linux :)

2021年1月14日更新

后来好像开了 VPN 也还是不管用,重启了路由器就好了。

2021年1月23日更新

前两天我用 PingPlotterPacket Loss Test 测试了一下发现确实是丢包造成的卡顿,大致的故障表现就是起先延迟正常,但是每隔 5-10 秒就 spike 一下。于是我打电话给 Fido tech support 然后描述了一下这个情况,他们今天派了一个师傅过来看。师傅大概是中午12点半左右到的,他先查看了一下我这幢楼外面的光纤信号,然后打电话给我说好像是外面光纤的信号问题,说他们需要 24-48 小时调一下,应该会好。我将信将疑,感觉是他敷衍我,于是我就又问他要了个新的路由器,然后我自己换上之后,问题就立刻解决了xD. 我试了试 Amazon EC2 G4 Instances + Parsec 的云游戏组合,发现 5-10 秒卡一下的问题消失了,不过体验还是没有本地独显跑的好,主要就是画质不好和 input lag 有些高,如果不玩这种 FPS 游戏,input lag 应该基本没有太大影响,但是画质问题是现在云游戏的“通病”,期待未来 AV1 编码对于画质的改善。

事情到这里终于有了一个圆满的结局,怎么样,这次折腾够折腾不?

2021年1月25日更新

这个卡顿现象在换好路由器后昨天又发生了,妈蛋。。。在跟 Rogers Home Internet L2 support 通了长达2小时的电话后还是没有结果,他们帮我 escalate 了一下 ticket,最后说如果还是不能解决的话他们也没有办法了,你只能去换一家 ISP (P.S. 这里插一句,如果你家有很多人一起使用,并且你要玩低延迟的 FPS 类型游戏,直接选 Bell Fibre,原因之后会讲)。说到这里我非常感谢帮我 troubleshoot 的小哥 Vincent (可能是这位?),他说话很实在,看得出在尽力帮我解决问题。我们在相互感谢后挂断了电话,可是问题仍然没有解决,依我以前的性格估计就放弃了,我当时真的有点怀疑是什么非常奇怪的 bug 导致的,理论上都说不通。。。可是!!我当天正好有点时间,于是在网上又是一顿搜索,开始是怀疑路由器的问题,因为新换的路由器也是同一型号的。后来再仔细搜了搜,发现很多人在讨论这个叫做 Bufferbloat 的问题,虽然问题也跟延迟有关,但是我刚开始不以为然,因为大多数人都是在 exaggerate 了带宽之后才发生的这个问题。后来我在检查了我的 motionEye 树莓派之后我貌似发现了一点端倪,由于我的 Fido 上传带宽只有 10 Mbps,我的 motionEye 每过几秒都会占用差不多 5 Mbps,我把 nload 显示的带宽占用图表和我的延迟图作对比,惊奇地发现它们的 pattern 竟然非常吻合,每当上传带宽占用的时候,延迟必然会出现一个小的 spike,有时候是 80 ms,而有时候甚至到了 300+ ms。到这里我还是不敢 100% 确定这就是问题所在,于是我又开了一局 CS:GO,把画面调成窗口模式,把两个图表放在旁边作对比,发现每次卡顿之前必有 spike,所以这就证明了问题确实和这个是相关联的。

最终的问题解决办法

该问题在 CS:GO 里的表现是 rollback/teleport lag, 虽然人物已经走到了某个位置,但是突然又闪回几秒前的位置。这是由于 UDP 丢包导致的,可以使用 iperf 来进行 UDP 丢包测试以确定问题。确定了 Bufferbloat 的问题之后,解决它就很容易了:

  1. 如果你的路由器支持 QoS 的功能,打开它就大功告成了。
  2. 如果不支持 QoS 的话,最简单的不花钱的办法就是限制网速,如果路由器支持网速限制的话就在路由器里把网速限制为你 plan 的 90%-95% 左右。如果路由器不支持限速,那只能在系统里限速,Linux 推荐用 wondershaper.
  3. 一劳永逸花钱的办法有升级 plan,更换支持 QoS 限速的路由器。
返回顶部 ↑

留下评论