我电脑里使命召唤OL装了三年,以前一直以为卡顿是显卡不行,直到我换了GTX1080,特效全开还能保持两百帧,才确定问题不在显卡上。可奇怪的是,不管我用原来的960还是现在的1080,只要一点“加入房间”,游戏立刻卡成数字幻灯片,鼠标移动都费劲,有时候黑屏加载能卡十几秒。等进到游戏里,一切又恢复正常,帧数照样跑满。最让我抓狂的是每局打完,转到结算画面那几秒,又会卡一下,而且时间长短不定。
为了搞清楚原因,我专门开着任务管理器打游戏,还把数据记下来对比。先说正常对枪的状态:CPU占用四成左右,显卡占用九成,内存占用大概七个G,网络延迟稳定在二十毫秒上下。可一旦点击加入房间,CPU占用在几秒内冲到九成以上,显卡占用反而跌到三成,网络延迟从二十跳到一百八十甚至两百多。这个数据很说明问题,卡的时候你的CPU和网络都在极限工作,显卡却在偷懒。也就是说,特效开多少根本不影响这个阶段的卡顿,因为它压根没在渲染画面。
为什么加入房间这么吃CPU?因为游戏服务器会在那个瞬间把所有玩家的完整状态一次性推给客户端。想象一下,十个人各自的坐标、朝向、生命值、武器配件、正在播放的语音动画,还有整个地图的可用物状态,比如门窗破坏情况、箱子是否被打开,都要在同一个时间片里解压并写入游戏内存。我观察过流量,进房间那几秒网卡接收速度能达到每秒好几兆字节,这还不算服务器丢包重传的数据。这么大量的网络处理,对老引擎来说负担很重。使命召唤OL用的还是基于早期使命召唤6改的引擎,对多核优化很差,大部分计算都挤在一个核心上。所以你的CPU主频不够高,或者单核性能弱,这里的瓶颈就会被无限放大。
我把游戏从机械硬盘换到固态硬盘以后,加入房间的黑屏时间明显缩短了,但卡顿依旧。因为磁盘读取只解决了加载地图的速度,真正卡的是网络同步那一段。后来我试着关掉游戏里的动态阴影,特效还是全高,结果加入房间的卡顿频率降低了,但游戏结束那个结算画面还是偶尔卡。这说明动态阴影对CPU的额外负担确实存在,但结算画面卡完全是另一码事。
游戏结束结算卡我琢磨了很久,最后发现是内存回收的锅。这个游戏有个很烦人的特点,内存占用会随着游玩时间不断增加。我连续打一个小时,内存占用能从开局的6G涨到10G。游戏结束后,所有玩家数据、击杀记录、统计图表要销毁,释放内存,但它的回收机制效率很低,垃圾回收器扫描整个堆的时候,游戏主线程会被阻塞,表现出来就是卡顿。任务管理器能看到内存使用率突然下降的那一瞬间,游戏必定卡一下。还有结算页面那些弹窗,每弹一个经验值、等级或者解锁提示,都要重新渲染一遍,这部分也是CPU在做,显卡帮不上忙。

再补充一点,很多人忽略网卡设置。我试着把网卡驱动里的“大量发送调整”关闭,加入房间的丢包情况有所改善,但作用有限。归根到底,还是游戏服务器本身的数据同步方式太落后,它不像现代游戏那样按区域分块传输,而是一次性把所有数据全塞过来,客户端处理器稍微慢一点就处理不过来。你想想,特效全开你的显卡能处理几百万个三角形,但进房间那一刻它只能干等着CPU把数据包解出来。
如果有朋友遇到同样情况,建议先别急着喷电脑配置。打开任务管理器看看,如果加入房间时CPU占用过高而显卡占用很低,那就不是显卡的问题。我后来把动态阴影关了,渲染分辨率还保持全高,进房间的卡顿次数少了很多。游戏结束的卡顿实在没法根治,只能当成每局重进游戏前的缓冲。毕竟这游戏后期已经停止大型更新,引擎优化就停在那个年代,再多的硬件升级也救不了老代码的顽固。