最近刷性能评测和数码圈内容的时候,总能撞见 “hyperframes” 这个词,翻译过来就是“超帧”,简单说就是在渲染输出的两帧真实画面之间,强行插入一帧“看起来合理”的合成画面,让视觉流畅度从 60 变成 120,从 120 变成 240。听着玄乎,实际上这几年显卡端的 DLSS 3 Frame Generation、AMD 的 AFMF,再到手机厂商爱宣传的“超帧引擎”,底层逻辑都是同一件事:补帧。
我为这个现象专门折腾了一个小项目,代号就叫 Hyperframes,顺便写了个帧时间分析脚本,把插帧前后的真实帧时间序列扒出来看了个透。这篇文章我会从头讲清楚超帧到底是什么、各家方案的分歧点在哪、以及最关键的两个问题:插帧后“看着流畅”为什么不等于“操作流畅”,以及你自己机器上到底该怎么开、怎么关。
1. 先搞清“超帧”到底在做什么:插帧不是在渲染,而是在“编造”
1.1 从“渲染一帧要多久”说起
不管 PC 还是手机,游戏画面都是一帧一帧渲染出来的。大家习惯用 FPS 来描述速度,但真正影响体感的是“帧时间”,也就是生成每一帧画面所花的时间。60 FPS 对应的平均帧时间是 16.7ms,但真实世界里帧时间往往在 5ms 到 35ms 之间波动。
平均值只能说明一个大致方向,波动才决定了到底卡不卡。所以判断任何画面技术,拉开帧时间曲线看永远比只盯平均帧率靠谱——这个基础认知必须立起来,因为超帧这个技术,本质上是改变“帧时间序列”,而不是单纯把某个平均值拉高。
这里打个比方:一个游戏渲染管线就像一间厨房,每道菜(也就是每一帧)都有固定的出锅时间。超帧就像服务员在两道菜之间偷偷补上一道“摆盘版”的菜,让客人觉得出菜很快,但厨房灶台上真正炒的菜并没有变多。理解了这个比喻,后面的很多问题都能顺下来。
1.2 超帧是给眼睛看的,不是给系统用的
超帧(Hyperframes,也有人叫插帧、补帧)的核心操作,是在两帧真实渲染出来的画面之间,插入一帧或多帧合成帧。这个合成帧不是 GPU 或 CPU 新渲染出来的,而是根据前后两帧的运动信息“猜”出来的中间画面。
它只服务于显示环节,游戏逻辑、物理计算、输入响应,通通没有它的份。所以超帧的第一条铁律是:画面流畅度提升,操作延迟不会因此下降,甚至可能上升。这个认知顶在脑子里,后面遇到很多宣传话术时就不会被带偏。
换句话说,超帧是典型的“治标不治本”:它治的是显示端的刷新缺口,不治的是渲染端的算力缺口。如果你因为“插帧后帧率翻倍”就觉得硬件升级都没必要了,那亏的肯定是自己。
1.3 中间帧怎么“猜”:从简单补间到光流
最简单的插帧是线性补间,也就是把前后两帧按 50% 透明度混在一起。这个做法静止画面没问题,一旦画面里有运动物体,就会出现重影,看起来像鬼影。
真正能用的方案必须考虑运动方向:先把画面按运动矢量拆开,把前景、背景分别移动到它们应该在的中间位置,再处理一下遮挡关系。这就是运动补偿插帧的基本原理,英文缩写 MEMC(Motion Estimation / Motion Compensation)。
游戏插帧技术里,运动矢量的来源也有两条路。一条是引擎侧来源,比如某家知名 N 卡插帧技术,用的就是引擎的运动矢量和光流加速器,画面信息非常准;另一条是屏幕侧来源,比如很多手机 MEMC 方案,直接用像素光流来分析画面内容,适用范围广,但遇到复杂场景容易算错。
两条路各有利弊:引擎侧信息准,但必须深度绑定渲染管线;屏幕侧普适性强,但快速转视角、大面积重复纹理的时候容易出现伪影。回到厨房的比喻——前者是厨师明确告诉你每道菜该怎么摆盘,后者是服务员拿眼睛看着两盘菜自己猜。
一句话结论:超帧技术真正的分水岭,不在“能不能插到 120 甚至 240”,而在“用什么信息来构造中间帧”。信息越准,伪影越少,成本也越高。
2. 各家“超帧”方案:同一个思路的三个分岔口
2.1 分岔口一:在哪个环节插帧
超帧听着好像都差不多,实际落地的位置差别特别大。按“在哪一层做插帧”划分,市面上主要有四类:
- 显示器 / 电视 MEMC:在屏幕驱动板上做补帧,输入什么信号它都补。适合看电影、看球赛,但不适合打游戏,因为补的是片源内容,而不是渲染内容。
- 手机独立显示芯片 / SoC 插帧:在渲染管线和屏幕之间插一层,由一颗专门芯片或者 SoC 内置模块完成。功耗可控,也是目前手机“超帧”的主流路线。
- 显卡端软件插帧:典型就是 PC 上那几家显卡厂商的方案。由驱动或模型生成中间帧,信息源更丰富,渲染管线的联动也更紧密。
- 离线 / 播放器软件插帧:比如视频播放器补帧、ffmpeg 离线补帧,处理质量和效率都受限于片源。
这四类的核心思路一样,但“插在哪一层”决定了它们的适用场景和副作用。电视那个 MEMC 之所以在游戏模式下被关掉,就是因为它根本不知道画面里哪部分是游戏操作界面,哪部分是场景,连鼠标指针都可能被当成运动物体来处理。
2.2 分岔口二:时域信息来自哪里
前面提到,插帧的本质是“猜中间画面”,那么“猜”的信息来源,就成了品质分水岭。
屏幕侧纯像素光流,思路是逐像素对比前后两帧的亮度变化,估算出每个像素点的运动方向和速度。听起来很合理,但实际画面里大量存在的情况是:物体边缘颜色相近、纹理重复、镜头快速移动,这些场景光流会算出一堆互相矛盾的结果,最后合成出来的帧就会出现边缘模糊、局部扭曲或鬼影。
引擎侧运动矢量,是游戏渲染管线里本来就有的数据。游戏里的 3D 物体每次移动,都会有个明确的运动轨迹,引擎完全知道一帧里物体从哪里挪到了哪里。拿到这种信息做插帧,中间帧的位置计算就变得非常干净,伪影也会大幅度减少。
所以一些 PC 端插帧技术会选择同时结合引擎运动矢量加光流,不能只依赖单一来源。这就是为什么手机 MEMC 方案在打游戏时,伪影问题往往比 PC 端方案更明显——因为它拿不到引擎里的运动矢量,只能靠屏幕像素瞎猜。
2.3 分岔口三:延迟兜底怎么处理
插帧无论如何都会给显示链路增加额外延迟。因为中间帧需要等拿到下一帧的“运动信息”才能生成,这意味着从渲染完成到显示上去,至少要再多等一个帧间隔。
做得好的方案都会同时做延迟兜底。比如一边插帧,一边通过降低渲染队列深度、启用低延迟模式等手段,把原来变长的延迟再往下压。你可以理解成厨房里一边加水,一边又在舀水出去,最后客人感受到的总水量没有变多。
所以你观察任何一家“插帧”宣传,如果只强调“补到 144Hz / 240Hz”,却完全不提延迟控制,那这个方案大概率只适合看视频,不适合操作型游戏。凡是把游戏超帧当卖点的设备,必然会把延迟控制作为绑定能力一起讲,因为它自己也清楚,光提插帧不提延迟,容易被懂行的人当场打脸。
我整理了一个简表,能直观看到这几种方案的差异:
| 方案类型 | 插帧信息来源 | 典型场景 | 最大坑 | 延迟影响 |
|---|---|---|---|---|
| 显卡端插帧(PC) | 引擎运动矢量 + 光流加速器 | 单机 3A、模拟器 | 强绑定渲染管线,老游戏不适用 | 有所增加,常用低延迟模式对冲 |
| 显卡端通用补帧(AFMF 类) | 屏幕像素 + 驱动光流 | 通用 DX11/DX12 游戏 | 复杂场景伪影明显 | 增加较多,需自行评估 |
| 手机 MEMC / 超帧 | 屏幕像素光流 | 游戏、视频 | 快速运动伪影 | 增加,部分方案可忽略 |
| 电视 / 显示器 MEMC | 屏幕像素光流 | 电影、综艺、球赛 | 字幕、UI、抬镜画面重影 | 高,不适合竞技游戏 |
3. “看着流畅”不等于“操作流畅”:我写了个帧时间分析脚本
3.1 为什么平均帧率会骗人
插帧技术出来后,“帧率翻倍”成了最容易被拿来当宣传卖点的数字。但只要你把帧时间拉出来看,就会发现里面藏着猫腻。
平均 100 FPS 并不等于流畅,如果这 100 帧里大部分帧时间都在 15ms 上下,突然来几帧 40ms,人眼会有明显的顿挫感。专业玩家和评测机构常用的指标是 1% low 和 0.1% low,意思是把所有帧时间排个序,最慢的那 1%(或 0.1%)帧的帧时间是多少。这个数值越烂,游戏卡顿感越强。
插帧恰恰是最容易造成“平均帧率好看、低帧率指标难看”的技术。因为它插进来的合成帧是“匀速”的,它会让前面那 1% 和 0.1% 的最慢帧从数据上消失很多,但如果某一时刻原生帧渲染特别慢,后一帧迟迟没出来,插帧也没有素材可做,只能卡住。
3.2 Hyperframes 脚本的核心逻辑
我之前用常见帧时间记录工具导出 CSV 格式的帧时间数据,然后写了个 Python 脚本去分析。代码思路并不复杂,大家可以直接参考。
import pandas as pd import numpy as np df = pd.read_csv("frametimes.csv") # 保留毫秒单位的帧时间列 ft = df["ms_between_present"].dropna() # 基础统计 p50 = ft.quantile(0.5) p1 = ft.quantile(0.01) # 注意这里 q=0.01 表示最慢的 1% 帧 p01 = ft.quantile(0.001) # 最慢的 0.1% 帧 print(f"avg={ft.mean():.2f}ms, p50={p50:.2f}ms, p1={p1:.2f}ms, p0.1={p01:.2f}ms")更值得看的是“超帧节奏模式”。正常渲染出来的原生帧,帧时间是一个随机波动序列,但如果插帧逻辑是“每两帧原生帧之间均匀地插一帧”,那帧时间序列会出现一种周期模式:比如 8ms、8ms、16ms、8ms、8ms、16ms 这样反复循环,其中比较长的那个 16ms 位置,对应的是真实的原生帧输出,而中间两个 8ms 是插帧时间。
我写脚本的目的,就是想从数据里找出这类周期模式,用量化方式判断:这个超帧到底是在“补全渲染节奏”,还是在“人工制造节奏”。下面是核心判断逻辑:
# 粗略检测重复周期模式:当两个相邻较短间隔后跟着一个明显较大间隔时,计入超帧特征 ft_arr = ft.values short_gap = 3.0 # 短间隔阈值,单位为 ms long_gap_ratio = 1.5 cycle_count = 0 for i in range(len(ft_arr) - 3): if ft_arr[i] < short_gap and ft_arr[i+1] < short_gap: period_sum = ft_arr[i] + ft_arr[i+1] + ft_arr[i+2] if ft_arr[i+2] > ft_arr[i] * long_gap_ratio: cycle_count += 1 print(f"检测到疑似超帧插入循环 {cycle_count} 次")这个脚本肯定谈不上生产级,但用来快速判断“某个插帧方案有没有在工作、工作方式是不是均匀补帧”,已经足够。你完全可以把这套思路自己跑一遍,用来量化对比不同设置下的插帧表现。
3.3 实测一例:插帧前后的两种“假象”
画个具体场景:一台中端游戏本,跑某一款竞速类单机游戏,原生 60 FPS。开启某款显卡端插帧后,显示输出显示为 120 FPS。
从帧时间序列上看,平均帧时间确实从 16.7ms 降到了 8.3ms 左右,但仔细观察能看到明显的周期规律:8ms、8ms、16ms、8ms、8ms、16ms。也就是说,游戏本体渲染出来的原生帧依然只有每秒 60 个,剩下的 60 帧是插帧合成的。画面刷新描边变顺滑了,但轮子碰撞、物体位置、光照阴影这些真正由游戏引擎计算的内容,依然固定在原来那 60 个采样点上。
这种状态会带来一个非常微妙的体感变化:运动物体看起来顺滑了不少,但当你快速转动视角要落点瞄准的时候,会发现视觉上一切都很连贯,手的操作却跟不上画面的节奏感。原因很简单:插帧填充的是显示刷新率,不填充输入响应。
3.4 我的判断规则
基于这些实测,我给自己定了一条非常实用的规则:
如果游戏不需要极限反应操作,插帧的伪影又不影响我感知,那就可以放心开;如果是需要精确瞄准、时机判定的游戏,插帧的收益远低于它带来的延迟和节奏干扰,必须关。
这条规则只有一个例外:游戏本 + 高刷屏 + 低帧率严重到玩不下去,但你又非要玩的时候,插帧可以作为“临时救场”方案。把它当成“眼睛的零食”,而不是“硬件的替身”,心态就平衡了。
4. 实战最容易翻车的三个坑:鬼影、延迟幻觉、测试误判
4.1 鬼影与伪影
超帧最明显的问题就是鬼影。场景里出现快速运动的人、飘动的头发、旋转的电扇叶片、扫过的字幕,都可能变成一层半透明的残影。
这背后的原理是光流算错了。像素级光流在纹理重复、边缘相似、遮挡严重的区域,本来就会产生歧义,它只能从视觉上“猜”一个最可能的运动方向。一旦猜错了,中间帧就会把不该出现的部分混进去。
实际用的时候,几个问题重灾区要尤其注意:
- 游戏里的 UI 和字幕:这些元素会跟着镜头一起缩放移动,光流经常把他们后面的一整块背景也拖走。
- 细条状物体:栏杆、铁丝网、格子围栏,是所有光流算法的噩梦。
- 快速转视角:场景整体全部在移动,没有一个静态参考点,光流很容易把前景和背景搞混。
缓解办法是优先使用支持引擎运动矢量的插帧方案,同时把插帧倍数控制在 2 倍以内,不要在已经开插帧的基础上再去套一层插帧。比如原生 30 FPS 插到 60,画面可能还凑合;原生 30 FPS 插到 120,伪影密集得没法看。
4.2 延迟幻觉
插帧延迟问题最容易让人产生误判。你开启插帧之后,显示器刷新率确实变高了,画面也确实顺滑了,但你的操作反应速度没有被提高。
这里面有个心理学因素:人眼对“画面的流畅度”和“操作的跟手度”会产生混合体验。当屏幕刷新率从 60 提升到 120,你会主观觉得“系统更快了”,但真正影响竞技表现的,是“按下鼠标到你看到画面变化”这个总延迟。插帧技术普遍会增加几毫秒到十几毫秒的额外延迟,对于需要 20ms 内反应的竞技场景,这个增量非常致命。
自己验证的方法也很简单:用手机慢动作对着屏幕拍摄,一只手点鼠标,另一只手观察枪口火光变化的时间差。原生 60 FPS、开插帧 120 FPS、再对比关闭插帧后的原生高帧率模式,延迟差一眼就能看出来。
我的实际使用经验是:竞技射击类游戏永远把原生帧率的提升放在第一位,插帧只适合用来回放、跑截图、或者玩单人剧情时开开看。
4.3 测试误判
最后一个坑是在评测和设置上容易踩的。
很多新手用手机上的帧率悬浮窗去测插帧效果,但那些悬浮窗往往只能读取系统帧率或者面板刷新率,根本测不到插帧生成的部分。看到数字翻倍就以为自己赚了,实际上数字只是显示了显示器的刷新频率,跟插帧算不算成功没有直接对应关系。
更靠谱的验证方式有三种:
- 看 GPU 占用率:插帧本身不太吃渲染算力,如果 GPU 占用没有显著上升,但输出帧率翻倍了,说明很可能走了插帧。
- 看显卡官方叠加层:PC 端方案一般有“Frame Generation:On”这类明确标记。
- 用手机慢动作拍摄显示器:把手机调到 240FPS / 480FPS 慢动作,对着屏幕拍旋转画面,放大逐帧看中间是否出现“半透明、运动补偿”的过渡帧。
误判的另一个来源是重复插帧。有些玩家在 60 FPS 原生帧率下开了显卡插帧到 120,又去电视那边开 MEMC 插帧到 240,层层套娃。结果画面伪影爆炸、延迟直接起飞,最后反而怪显卡或者显示器不行。
5. 我现在实际怎么用“超帧”:一份可以直接抄的调校清单
5.1 按场景分类的策略表
跑完上面这一堆测试,我的超帧使用策略已经固定下来,直接分享给你们参考:
| 使用场景 | 建议设置 | 理由 |
|---|---|---|
| 单机 3A 剧情大作 | 开启 2 倍插帧,配合高刷屏 | 画面顺滑收益明显,伪影可接受,延迟敏感度低 |
| 竞技 FPS / 格斗 / 音游 | 关闭插帧,优先原生高帧率 | 操作延迟和节奏感比视觉顺滑重要得多 |
| 模拟器 / 怀旧主机游戏 | 开启 MEMC | 老游戏原生帧率低,补帧后体感提升巨大 |
| 竞速 / 飞行模拟 | 视驾驶舱仪表和地面网格决定 | 场景纹理复杂,伪影多,需要逐个场景验证 |
| 日常视频 / 球赛 | 电视 MEMC 常开没问题 | 内容本身就是低帧率,补帧后观感明显变好 |
这个表是基于“大多数玩家”的典型设备写的,如果你的设备或游戏有特殊之处,可以灵活调整。但有一条是我始终不变的底线:任何竞技内容都不碰插帧。
5.2 开启步骤和设置要点
PC 端显卡方案的开法其实大家都会,我就不写菜单路径了,关键是要注意几个设置配合:
- 先把垂直同步关掉。垂直同步会强行让游戏输出匹配显示器刷新率,和插帧叠加之后容易出现重复帧和锁帧冲突。
- 如果硬件支持 G-SYNC / FreeSync,可以保留显示器侧的可变刷新率,然后单独开插帧,这样能减少画面撕裂。
- 在游戏里尽量把帧率锁定在原生渲染能力的整数倍帧率上,比如原生 40 FPS,插帧 2 倍到 80,选这种整数倍关系最容易获得稳定效果。
手机端的“超帧”功能一般藏在游戏助手、性能面板或者插帧设置里,不同品牌叫法不一样。开之前先看一眼手机温控状态,插帧虽然对 GPU 算力的要求不高,但持续高刷新率输出会增加屏幕驱动和显示链路功耗,发热量依然不小。
5.3 判断“是否真的生效”的三个土办法
如果你不想看数据,又想快速判断设备上的超帧到底有没有工作,可以试试这三个笨办法:
- 快速转动画面:开启超帧时,很多设备会有一种“过度平滑”的观感,动起来不像原来那样逐帧跳动,而是带有一种轻微的“涂抹感”。
- 手机慢动作拍摄:找一个运动场景,用 240FPS 慢动作拍屏幕,回放逐帧看。如果相邻两帧之间多了一个中间帧,那就是插帧在工作。
- 截图连拍对比:插帧生成的中间帧无法从游戏引擎里直接截出来,但可以用手机对着屏幕连拍,偶尔能拍到“半透明重影”的过渡帧。拍到之后基本就能确认插帧处于生效状态。
这三种方法都不需要装任何监控软件,适合所有设备和使用环境。
5.4 给同好开发者:下一步可以怎么扩展
如果你也想折腾超帧测量工具,可以在我的思路上继续加功能。比如用 Python 读取帧时间 CSV 后,自动识别“疑似超帧周期”,再把检测结果导出成图表,高亮标出哪些区域是真实原生帧、哪些区域是合成帧。
更进一步,可以把延迟测量和帧时间分析串在一起,输出一个综合性的“体验质量评分”,综合原始渲染质量、插帧伪影、操作延迟三个维度。这个话题延伸空间很大,正好也是我接下来想继续折腾的方向。
我自己跑完这一圈,最大的收获其实不是某个显卡设置选项,而是一种判断能力:看到任何“超帧”“插帧”“补帧”宣传,先问一句“它的画面信息从哪来”“延迟有没有兜底”,然后再决定要不要买账。
画面是给眼睛看的,延迟是给手用的,游戏如果主要靠操作,那我会无条件把延迟放在第一位。这就是我的全部原则。如果你也在折腾超帧相关的设置,建议别只看平均帧率,把帧时间序列拉出来看一眼,情绪会稳定很多。