在一台 RX560D 上撞见插帧
今天突发奇想,给那台 RX560D 的电脑装上了 Forza Horizon 5,看看能跑到什么性能。
本来完全不抱任何期待。能跑个 30fps 就谢天谢地了。
结果我惊诧地发现,在 1080p 的无缩放分辨率上,它完美地跑到了稳定的 60fps。
只有两个地方感觉怪:画面边角的运动模糊有点猛烈;侧窗视角的运动模糊有点噪点。
于是我打开设置选项,把运动模糊改了一个配置,再进游戏。
40fps 左右。帧速率不稳到没法玩,并且画面分辨率还变低了。
这就纳闷了。按常理,关掉或调低一个后处理效果,性能应该往上走才对。
计数器写的是 30
然后我把游戏内的 fps 显示打开。
原来那套配置下,它写的是 30。
但肉眼感受和 GPU 传回的数据,的确是 60。
我瞬间明白过来了:插帧。
这是推断,不是结论
先把话说清楚:我没有抓帧,没有做任何逐帧比对,也没有拿到任何官方说明。 下面这些只是我认为最能解释现象的那个解释。
支持它的有三点:
- 游戏内计数器和实际观感差了整整一倍,这个比例太干净了,不像是测量误差。
- 那两个”怪”的地方,恰好是重建帧最容易露馅的位置。屏幕边缘缺少参考信息,侧窗这种高速横向移动的区域运动矢量最不可靠 —— 边角糊得猛、侧窗有噪点,都符合这个方向。
- 改运动模糊设置直接让它失效了。这说明那条路径和运动矢量是耦合的,而运动模糊正好是运动矢量的另一个消费者。
第三点是我最看重的。一个和帧率无关的画面选项,能把帧率打对折,这本身就不正常。
值得研究
这是我第一次在商业游戏里,看见把插帧玩得如此之顺的。
想来之前我自己做的那个基于 WebGL 的 30 插 60 的 demo,感觉可行性确实出来了 —— 而且它在低端卡上的收益反而更大,因为低端卡最缺的正是那一半的帧。
如果要往下研究,具体的问题是这几个:
- 遮挡区域怎么补。被前景挡住、这一帧才露出来的像素,在两张参考帧里都没有信息。
- UI 层要不要参与。参与就会跟着糊,不参与就要单独合成。
- 延迟增加了多少。插出来的帧在时间上是”过去的”,手感的代价必须量出来。
- 在没有引擎配合的情况下,怎么拿到可靠的运动矢量。
边界
一台机器、一个游戏、一次观察,没有抓帧、没有对照组。
除了帧率读数以外,上面全部是推断。
评论