1%low帧 讲解与举例第二集:在1% low帧相同的前提下,我们希望平均帧越低越好

KxngDemon-avatar

KxngDemon

2024-04-04T18:18:02+00:00

接第一集:聊聊1% low帧、掉帧、卡顿、帧数高但不流畅、不跟手这些概念
[url]https://bbs.nga.cn/read.php?tid=37349925[/url]

起因是Q群讨论DDR4和DDR5游戏性能的时候,自然而然的拿出了59172的那个测试数据。
[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-2fjyZqT3cS25o-zu.jpg[/img]
在这个数据里,DDR4和DDR5的平均帧几乎一样,但DDR5的1% low帧落后了DDR4接近10%。
这个数据表面上看起来没什么异样,就是很正常的表现了DDR4在这个游戏里强于DDR5,差了10%也不多。
但问题在于,在平均帧几乎一样的前提下,1% low帧相差10%,其实是个非常非常巨大的差距,远非表面的10%所能表示。

为了方便后续讲解,还是先从理论开始说起。
先回顾一下第一集中说到的1% low FPS average的定义:所有帧中,按顺序取帧生成时间最大的、占帧的总数量的1%的帧,计算这些帧的帧生成时间的平均值。使用公式“1000毫秒/帧生成时间平均值=帧率”,最终结果用帧率来表示。

1% low FPS其名字看起来像是帧率(FPS),但其本质是frametime。
考虑一个叫1% high frametime的定义:所有帧中,按顺序取帧生成时间最大的、占帧的总数量的1%的帧,计算这些帧的帧生成时间的平均值。
可以发现1% low FPS和1% high frametime的定义的唯一区别,就是有没有后半部分的“使用公式‘1000毫秒/帧生成时间平均值=帧率’,最终结果用帧率来表示。”,而前半部分是一模一样的。

换句话说,1% low FPS和1% high frametime就是同一个东西,只是表达方式不同。
后面会使用1% high frametime,以强调1% low FPS的frametime本质。

为了便于理解,可以简单的把帧分成两种:卡顿帧和非卡顿帧

平均帧(AVG FPS)很好的表示了非卡顿帧的平均frametime。
比如平均帧200FPS,说明非卡顿帧的平均frametime 5ms。
平均帧100FPS,说明非卡顿帧的平均frametime 10ms。
平均帧几乎一样,说明非卡顿帧的平均frametime几乎一样。

在正常的游戏的frametime数据中,非卡顿帧占了绝大部分,而卡顿帧只占了极小部分。
具体举例,比如99.99%都是非卡顿帧,只有0.01%才是卡顿帧。
那么1% high frametime的取值,就是取这占总数0.01%的卡顿帧,以及占总数0.99%的较大的非卡顿帧,计算这些帧的frametime的平均值。

显然,即便是已经在1% high frametime的样本里,卡顿帧和非卡顿帧的比例也达到了悬殊的1:99。
也就是说,非卡顿帧数量占据了样本的绝对主导地位, 非卡顿帧数量>>卡顿帧数量。
此时卡顿帧的frametime对1% high frametime的数值影响非常小,非卡顿帧的frametime对1% high frametime的数值影响非常大。

用一个比较通俗的说法来形容,就是1% high frametime的数值组成中,卡顿帧被大量的非卡顿帧稀释了。
就像1滴浓牛奶和99滴稀牛奶混合,最终的混合物的浓度就会绝大部分取决于稀牛奶的浓度。

在开头说的例子中,
已知非卡顿帧frametime几乎一样(因为平均帧几乎一样),卡顿帧出现频率几乎一样,连已经被严重稀释的1% high frametime的数值都能差出来10%,那么原始没有被稀释的卡顿帧frametime会差多少?

用比喻的说法就是:
已知稀牛奶浓度几乎一样,用同样的比例把稀牛奶和浓牛奶混合,连已经被严重稀释过的牛奶的浓度都能差出来10%,那么没有稀释时,弄牛奶的浓度会差多少?

下面举一些真实跑出来的数据的例子,看看在平均帧几乎一样的前提下,1% low帧相差10%,实际的差距到底差了多少
例子1
[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-jbsrKbT3cS14v-9y.png[/img]
平均帧相差2%,可认为几乎一样。
1% low帧相差8%。
如果只看这两个数据,看起来不是什么大的区别。

但非卡顿帧稀释程度更少的0.1% low帧相差了60%,已经说明了一些问题。
我们再看看实际的frametime曲线。

[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-ic9fKtT3cS1gy-w1.png[/img]
一个的卡顿帧是20-25ms,另一个的卡顿帧是30-35ms,实际差距就是50%以上。

例子2
[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-9bv8K8T3cS14c-a6.png[/img]
平均帧相差0.2%,可认为一样。
1% low帧相差11%。
如果只看这两个数据,看起来不是什么大的区别。

但非卡顿帧稀释程度更少的0.1% low帧相差了110%,已经说明了一些问题。
我们再看看实际的frametime曲线。
[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-l3ktKlT3cS1gg-vp.png[/img]
一个的卡顿帧是10ms,另一个的卡顿帧是20ms,实际差距就是100%以上。

这个差别是如何造成的呢?
一个跑4.7G,一个跑3.0G。
一个跑4.7G,一个跑3.0G,如此巨大的核心性能差别,在平均帧相同的前提下,都才能令被稀释的1% low帧差出来11%。

现在我们回去看51972那个数据,在平均帧相同的前提下,DDR4和DDR5被稀释的1% low帧差出来接近10%。
假如把frametime曲线拉出来看,卡顿帧的frametime必然差距巨大。
如果该测试数据靠谱,那么可以说明DDR4和DDR5的游戏性能差异,和4.7G和3.0G的游戏性能差异差不多了。
DDR5可以说是卡的没法玩,游戏性能等效落后2-3代,大概相当于10代对13代。
这显然不符合逻辑,DDR4和DDR5只相差5ns左右的空载内存延迟,不可能造成那么大的差距。

我个人认为,会造成如此巨大的卡顿表现差异的原因不在DDR4和DDR5上,而在于那个测试用的微星和华硕主板上,又或者是其他原因。
比如,华硕主板一旦打开asus ec,就会产生巨量硬件中断并导致游戏卡顿。
比如,奥创/神光同步产生巨量硬件中断并导致游戏卡顿等等。


在前面的例子中,我们得到了结论:
在平均帧相同的前提下,1% low越高越好。
并且1% low在数值上是被稀释的,因此实际差距将远远大于1% low数值上的差距。

我们也可以自然的从这个结论中得到一个推论:
在1% low相同的前提下,平均帧越低越好。
平均帧越高,卡顿情况就越严重。

这是因为平均帧越高,说明非卡顿帧的平均frametime越小。
非卡顿帧的平均frametime越小,被纳入1% low FPS/1% high frametime样本中的非卡顿帧数量越多、占比越大。
非卡顿帧占比越大,1% high frametime的数值被非卡顿帧稀释的程度就越严重。

平均帧更高的、被非卡顿帧稀释程度大的、虚高的1% low帧,只和平均帧更低的、被非卡顿帧稀释程度小的1% low帧堪堪打成平手。
这就说明了前者的卡顿帧的frametime,是远比后者更糟糕的。

这种数据,在zen4非x3d和zen3x3d的优化差的游戏对比中比较常见。
这种数据是非常迷惑小白的。
小白会觉得1% low帧已经打平手,平均帧还更强的,显然那个更好,但实际游戏体验是反过来的。

[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-11iiZkT3cS15v-id.png[/img]

[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-b8atZ1bT3cS1uv-ex.png[/img]

[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-8d0xZwT3cS1uu-ec.png[/img]

[img]https://img.nga.178.com/attachments/mon_202404/11/9aQk5y-3egfK23T3cS1ex-tf.png[/img]

如果非要分析造成这种现象的原因,那就是
zen3x3d利用缓存内存优势,在非卡顿帧的优势区间疯狂刷分,降低非卡顿帧的frametime、拉高平均帧,并通过这个方式稀释了1% low帧,使得1% low帧在数值上不会太难看,但单核性能不行的结果就是遇到硬吃单核的卡顿时就遭重了;
而zen4非x3d虽然缓存内存不如对手强,非卡顿帧的frametime更大、平均帧更低,但他有单核性能优势,在出现硬吃CPU单核性能的卡顿的时候可保住卡顿的frametime表现。

如果让我在这两个里面选,我必然是选后者。
我不会在意非卡顿帧4毫秒(平均帧250)和5毫秒(平均帧200)的这区区1毫秒的区别,但我会很在意卡顿帧20毫秒和25毫秒的5毫秒区别。
chonas-avatar

chonas

现在国服又要开了,等新一轮的测试。
到底这x3d对wow是不是特攻。
IncrediblyDead-avatar

IncrediblyDead

这个反直觉的例子非常好。
同样的1%low帧下,平均帧越高越卡。
甚至完全可能平均帧1%low帧双杀,实际更卡
--
lz的模型建立在卡顿帧极少1%low帧被大量稀释的前提下。这种情况非常适合估算
这样可以把卡顿的时间整个帧率近似成0帧,那么在卡顿时间一样的情况下平均帧正比于1%low帧
也就是说,可以用1%low除以平均帧估算实际的1%low帧,非常方便

当然如果有条件还是测帧生成时间更好
Redrix-avatar

Redrix

确实是学到了
shadowq4-avatar

shadowq4

学到了学到了
clould-avatar

clould

fps的原理类似加窗傅里叶变换:fps实际上是一个矩形窗函数在整个时间轴上平移,将窗函数内的帧数平均,得到的指标
体感影响大的卡顿,在这个概念里被平均掉了,也可以说被低通滤波滤掉了。
正如加窗傅里叶变换无法同时在时域和频域达到精确,fps这个指标也很难揭示时域上的毛刺。
测量cpu内存造成的卡顿时,应该用更本质的指标,即帧生成时间
RyneAuto-avatar

RyneAuto

还是看天书容易点……
Max_the_duck-avatar

Max_the_duck

没道理的,为了让1%最卡的时候稍微不那么卡,反而去牺牲99%的正常时候的帧数。

指望靠cpu力大砖飞来给游戏厂家的优化擦屁股吗。
Ham Porker-avatar

Ham Porker

这里面还有个很大问题,就是小飞机是1%low不是实时的,是按下benchemark后这一整段时间内的,所以很容易抓不到那种频率不高的卡顿

PS:想起个事情,b站有个up提出xmp参数比手动小参好,结果点进去一看他的统计都不控制变量,就是边打边录的cs2视频,连平均帧都差了10%以上(足够说明对局差距巨大了吧)在这比0.1%low[s:ac:哭笑]而且他的0.1%也就是10%多点这个范围,其实完全就是对局不同产生的平均帧差距导致的
TestosteRonin-avatar

TestosteRonin

图1下面第一句,“DDR5和DDR5的平均帧几乎一样”是想说“DDR5和DDR4”吧?
purple yoshi-avatar

purple yoshi

一般来说比喻就是胡扯的开始 1%的本质是厂商在写屎,而屎的memory access pattern和其他正常代码是完全不一样的,不同游戏之间的pattern也是完全不一样的 你用apex的1%差距去论证永劫无间的1%差距完全是胡扯,意思就是永劫无间中的屎代码写的和apex中的屎代码完全一致
不同游戏的1%和同一个游戏平均帧和low帧数据实际上是毫无关系的,low帧只能代表cpu吃特定风味屎的能力

最后写的很好
但我会很在意卡顿帧20毫秒和25毫秒的5毫秒区别
但是正常人看到一个游戏写的屎成这样会选择换一个游戏,你是非玩这个不可吗,还专门为了low帧去选cpu
בברה-avatar

בברה

Reply to [pid=752766343,39828064,1]Reply[/pid] Post by [uid=42925260]tcbbb[/uid] (2024-04-11 02:44)
其实最核心的、我该说的早就在第一集说完了
我第一集的核心观点就是:不要再看平均帧和1% low帧了,这些数值《都什么意义》,直接去看frametime就是最好的

但考虑到网上存在的绝大部分数据都是平均帧和1% low帧,而极少有frametime数据
所以这第二集的意义就是,考虑《废物利用》,从平均帧和1% low帧这两种《没什么意义》的数值,根据其原理可以反推什么结论出来
בברה-avatar

בברה

Reply to [pid=752768875,39828064,1]Reply[/pid] Post by [uid=60979474]STHGINKRA[/uid] (2024-04-11 03:59)
你可能还是没理解
考虑一下这几个的统计数据

平均帧60FPS,1% low帧60FPS:
理论上完美而稳定的主机端60帧体验,没有一丝卡顿

平均帧100FPS,1% low帧60FPS:
虽然经常出现卡顿,但勉强还能玩下去

平均帧1000FPS,1% low帧60FPS:
Literally Unplayable
Delvaray-avatar

Delvaray

这个结论的前提是,游戏的卡顿帧数量小于1%,比例越小,这一关系越强。
不过万一有什么屎优化游戏真有1%甚至以上的卡顿帧呢[s:ac:哭笑]
Ham Porker-avatar

Ham Porker

Reply to [pid=752770452,39828064,1]Reply[/pid] Post by [uid=38922157]嗯嗯嗯嗯什么[/uid] (2024-04-11 05:16)

数毛社digital foundry 也多次在节目中谈及1%low数据是不靠谱的,要看frametime
51972这个测试我基本确定是引入了其他变量的,因为d5的7600和8000都能有7%差距,这根本就太扯了
בברה-avatar

בברה

Reply to [pid=752769532,39828064,1]Reply[/pid] Post by [uid=61082285]polly24[/uid] (2024-04-11 04:30)
其实low FPS从定义发明开始,一般的使用方式就是某段特定时间内的所有统计数据,而不是“伪实时”的滑动窗口型
滑动窗口型一开始其实是为了解决percentile buffer不足的问题,不过最近反而因为能减少非卡顿帧对low FPS统计上的稀释影响,而变得更有意义

RTSS是可以选的
[img]https://img.nga.178.com/attachments/mon_202404/11/9aQuy2v-cnzbK2T3cSiy-30.png[/img]

[img]https://img.nga.178.com/attachments/mon_202404/11/9aQuy2v-lbtyKfT3cSi4-cf.png[/img]

说到底,既然都开始追求用滑动窗口的“实时性”来降低非卡顿帧的影响,那么为什么不干脆直接看实时到不能再实时的frametime呢?
בברה-avatar

בברה

Reply to [pid=752770610,39828064,1]Reply[/pid] Post by [uid=37167903]halala007[/uid] (2024-04-11 05:26)
卡顿多如原神,优化如此之烂,卡顿帧的占比一般也只有不超过帧总数量千分之一的数量级

如果卡顿帧是帧总数量百分之一的数量级,那意味着假如游戏运行在平均100FPS,平均每秒就会出现1次卡顿
对于这种游戏,我的建议是直接卸载退款一气呵成
בברה-avatar

בברה

Reply to [pid=752770059,39828064,1]Reply[/pid] Post by [uid=34731522]Can Use[/uid] (2024-04-11 04:58)
那些比喻和例子都可以不看的,用这些比喻和例子只是为了方便理解(讲解)而已

单纯从1% low帧这个统计数值其自身的定义,纯靠定义的理论推演已经足够说明:
在平均帧几乎一样的前提下,1% low帧相差10%,其实是个非常非常巨大的差距,远非表面的10%所能表示

这个理论是无关特定游戏的,几乎可以适用于任何游戏的统计数据的判断
TestosteRonin-avatar

TestosteRonin

1% high frametime增大,那是不是:既有可能是卡顿帧的frametime更大(出现卡顿帧时更卡),也有可能是卡顿帧占比更高(卡顿帧出现频率更高),甚至两者同时作用带来的呢?

但不管怎么说,这两种情况带来的体验都很糟糕
IncrediblyDead-avatar

IncrediblyDead

Reply to [pid=752770881,39828064,1]Reply[/pid] Post by [uid=63001867]怡_寶[/uid] (2024-04-11 05:42)
只看1%
这两种区分不了
因为这本来就是平均值,你要区分就得看比如0.1%,问题是如果已经能看0.1%那还看个毛1%