易恺铭
EN

在一台 RX560D 上撞见插帧

约 2 分钟

今天突发奇想,给那台 RX560D 的电脑装上了 Forza Horizon 5,看看能跑到什么性能。

本来完全不抱任何期待。能跑个 30fps 就谢天谢地了。

结果我惊诧地发现,在 1080p 的无缩放分辨率上,它完美地跑到了稳定的 60fps。

只有两个地方感觉怪:画面边角的运动模糊有点猛烈;侧窗视角的运动模糊有点噪点。

于是我打开设置选项,把运动模糊改了一个配置,再进游戏。

40fps 左右。帧速率不稳到没法玩,并且画面分辨率还变低了。

这就纳闷了。按常理,关掉或调低一个后处理效果,性能应该往上走才对。

计数器写的是 30

然后我把游戏内的 fps 显示打开。

原来那套配置下,它写的是 30。

但肉眼感受和 GPU 传回的数据,的确是 60。

我瞬间明白过来了:插帧。

这是推断,不是结论

先把话说清楚:我没有抓帧,没有做任何逐帧比对,也没有拿到任何官方说明。 下面这些只是我认为最能解释现象的那个解释。

支持它的有三点:

  • 游戏内计数器和实际观感差了整整一倍,这个比例太干净了,不像是测量误差。
  • 那两个”怪”的地方,恰好是重建帧最容易露馅的位置。屏幕边缘缺少参考信息,侧窗这种高速横向移动的区域运动矢量最不可靠 —— 边角糊得猛、侧窗有噪点,都符合这个方向。
  • 改运动模糊设置直接让它失效了。这说明那条路径和运动矢量是耦合的,而运动模糊正好是运动矢量的另一个消费者。

第三点是我最看重的。一个和帧率无关的画面选项,能把帧率打对折,这本身就不正常。

值得研究

这是我第一次在商业游戏里,看见把插帧玩得如此之顺的。

想来之前我自己做的那个基于 WebGL 的 30 插 60 的 demo,感觉可行性确实出来了 —— 而且它在低端卡上的收益反而更大,因为低端卡最缺的正是那一半的帧。

如果要往下研究,具体的问题是这几个:

  • 遮挡区域怎么补。被前景挡住、这一帧才露出来的像素,在两张参考帧里都没有信息。
  • UI 层要不要参与。参与就会跟着糊,不参与就要单独合成。
  • 延迟增加了多少。插出来的帧在时间上是”过去的”,手感的代价必须量出来。
  • 在没有引擎配合的情况下,怎么拿到可靠的运动矢量。

边界

一台机器、一个游戏、一次观察,没有抓帧、没有对照组。

除了帧率读数以外,上面全部是推断。

评论