最近换了块新显卡,本以为能痛快玩《荒野大镖客2》,结果每次开机进游戏,前十分钟帧数稳定在七十,画面丝滑,可一到第十一分钟左右,屏幕突然僵住,鼠标拖不动,声音卡成电音,持续大概十秒,然后又恢复如初。过五六分钟,又来一次,十秒,循环往复。这毛病不是温度墙,也不是显存爆了,我挨个排查,最后发现是硬盘在作祟。
先说配置,CPU是锐龙5600,内存双通道16G,显卡是RTX 3070,电源额定750W,系统盘是三星970 EVO 500G,游戏装在希捷2T机械盘上。画质开2K高,显存占用显示8G里的6.8G,温度CPU和显卡都在七十度上下,完全正常。卡顿出现的时间点非常有规律,不是随机的,我掐表测了三次,都是游戏运行到10分20秒到10分40秒之间开始卡,持续8到12秒。
最初我怀疑是虚拟内存或系统后台在搞鬼。打开任务管理器,发现卡顿瞬间磁盘占用率飙到百分之百,但看进程是游戏本体的读取操作。这就不对劲了,因为游戏开头十分钟已经把所有过场和地图纹理加载得差不多,后面应该主要靠内存和显存。我又用资源监视器盯,发现卡顿期间希捷机械盘的读取队列长度暴涨,每秒吞吐量从平时二十多兆突然跳到一百五十兆,持续好几秒,然后回落。
原因很快清楚,机械盘在读一个固定的大文件,大概是游戏世界某个区域的预加载数据。问题是为什么偏偏卡在十分钟左右?我打开游戏的地图移动轨迹,发现我恰好是在固定路线跑动,每到一个大场景的边界,游戏就会触发流式加载,而这个加载恰好落在机械盘的AHCI协议和碎片化文件上。我用CrystalDiskMark测了这块游戏盘,顺序读取160MB/s,但4K随机读取只有0.8MB/s,而当代大型单机的地图流式加载恰恰吃随机小文件读取,尤其是荒野大镖客2这种开放世界。
更直接证据是,我把游戏拷到系统盘三星970 EVO上,同样画质同样路线跑了半小时,再也没出现卡顿。机械盘在连续读取动画文件没问题,但一旦遇到大量小体积的纹理和模型文件,寻道时间跟不上,就会卡出十秒的停顿。这也解释了为什么前十分钟不卡,因为开头区域的数据被系统预读进了内存缓存,等缓存用完,后续流式加载只能直接读盘,机械盘的随机性能短板就暴露了。

要说物理层面的原因,这块希捷盘用来五六年,碟片可能有坏道,但全盘扫描没有红块,只是碎片多,文件分配表陈旧。我用系统自带碎片整理工具分析,碎片率到了百分之十七,对机械盘来说已经很高。碎片会让磁头寻道距离变长,随机读取更慢。至于为什么卡十秒而不是一两秒,是因为游戏可能一次性请求了几百个文件,硬盘磁头在一堆碎片间来回跳,最后耗时这么久才凑齐数据,游戏引擎因为在等待这些文件,所以整个画面和物理运算都阻塞了。
另外我还试过关闭游戏内的垂直同步,调整预渲染帧数,都没效果,因为瓶颈在存储设备,跟渲染管线没关系。内存占用在卡顿期间也只到11G,远没满。所以最终结论就是,玩大型单机十分钟左右卡十秒,大概率是游戏安装在机械硬盘上,且该硬盘随机读取性能差以及碎片化严重。如果各位遇到同样规律性的卡顿,先别怀疑显卡或CPU,把你游戏盘换成固态,或者至少做一次磁盘碎片整理。要是条件允许,整个M.2固态做游戏盘,这毛病立刻消失。我现在就是把游戏挪到NVMe盘上,玩一晚上一次都没卡过。这个排查过程没有玄学,数据摆在这里,任何机械盘在流式加载高密度开放世界时都扛不住。