事情得从那个通宵的夜晚说起——我盯着《赛博朋克2077》的街头霓虹,Steam左下角跳出的帧数一直在58和62之间来回晃,可我总觉得画面没那么流畅。于是翻出两年没用的MSI Afterburner,结果两个帧数居然对不上,差了好几帧。那一刻我整个人都不好了,心想:难道这破Steam一直在骗我?
Steam帧数显示是怎么来的?
Steam的帧数计数器并不是什么高精密的仪器。它通过游戏内覆盖层注入一个API钩子,抓取每次Present()或者SwapBuffer()调用的间隔,然后粗略地把1000毫秒除以那个间隔,得出一瞬间的帧率。听起来挺科学,但问题就出在“一瞬间”上。Steam的采样窗口很窄,而且它不会像Afterburner那样做长时间的平均平滑,导致数值跳得厉害,尤其是在显卡负载忽高忽低的场景里,比如刚进新区域或者出现大量粒子特效的时候。
和主流工具的对比:差距在哪?
我连着三天,把Steam、NVIDIA的GFE、AMD的Adrenalin还有MSI Afterburner全开干了一遍。拿《德军总部:新血液》和《极限竞速地平线5》做测试,前一个是稳定输出型的,后一个对即时渲染要求高。结果发现,在垂直同步关闭的前提下,Steam的读数其实跟Afterburner的平均帧相差不到2%,但峰值和谷底差了有5~8帧。NVIDIA的帧数显示则更偏向“视觉流畅性”,它多了一层驱动层面的自适应调整,所以看着反而比Steam“稳重”。而Afterburner的RTSS(RivaTuner Statistics Server)的读数最稳定,采用的扫描技术也最底层,几乎就是引擎直接喂出来的。
为什么会有差异?锅在谁身上?
第一个锅,是Steam的采样周期太死板。它固定的刷新周期假如正好卡在两次帧生成之间的空档,读数就会偏低或偏高。第二个锅,是渲染管线里的“无帧返回”情况——当CPU在忙着处理逻辑,显卡空转,Steam可能把那段空档也算作一帧,而Afterburner会聪明地忽略掉空转,只统计实际渲染出的画面。第三个锅,是G-Sync和FreeSync这种黑科技。当刷新率和帧率不匹配时,Steam有时候读的是显示器刷新次数,而不是真实渲染次数,这就会造成迷惑。
我自己碰到的邪门现象
玩《彩虹六号:围攻》的时候我发现了更离谱的事:打开Steam覆盖层后,帧数偶尔会掉那么3~5帧。关掉覆盖层,用Afterburner看就读秒正常。我把Steam的帧数选项在“高对比度”和“普通”之间切换了几次,发现显示位置变化竟然也能影响读数——可能是角落不同区域的CPU开销不一样。这种玄学让我对Steam的准确性彻底死了心。
- Steam的优点:轻量,不用额外装软件,够给普通玩家当个参考。
- Steam的缺点:跳帧严重,不支持帧生成时间显示,受覆盖层本身性能影响。
那Steam的帧数到底“对”吗?
我的看法是:对的,但不精确。它就像一把卷尺和游标卡尺的区别——要量个大概,卷尺足够;要拿去刻零件,卷尺只能气死你。Steam的设计初衷压根不是给发烧友做微调工具,而是让你快速知道游戏“能不能跑动”。所以如果你只是开个Steam看看是不是60帧,那没必要纠结。如果你开始怀疑卡顿来自某个渲染环节,请赶紧关掉Steam显示,换专业的分析软件。
现在每当我看到直播里有人拿Steam帧数来证明显卡性能,我心里就会咯噔一下,想起那个被骗的晚上。帧数这个东西,本就是一幅粗糙的素描,而Steam不过是蘸水笔尖,粗粝而直接。真要精益求精,还是请上RTSS。
