dota2的一点后续研究

jaime-avatar

jaime

2025-08-26T13:19:20+00:00

为了dota2保持滚屏的绝对平滑,我都是锁帧然后用afmf插帧2倍,然后发现了个奇怪的现象:比如说驱动内锁帧80,但是游戏中自带的帧率计数偶尔会跳到85,外部帧数帧检测是正常的80帧。

这个现象让我想到了b站看到的一篇技术文章:[url]https://www.bilibili.com/opus/21865944793378716[/url] ,其中有这么一段:
垂直同步+三重缓冲是种非常棒的技术,可以有效地改善画面撕裂,同时不造成画面延迟。但是问题来了,DirectX 并不原生支持三重缓冲!而是使用了一种叫“预渲染队列“的方式。这种方式与三重缓冲不同的地方在于,它不会丢弃显卡渲染完却未被使用的帧(即过时的帧),而会强制将这些旧帧显示出来,因此会造成更大的操作延迟,甚至比光开垂直同步的延迟还要大。DirectX 的游戏若想使用三重缓冲,需要游戏厂商提供相应的支持。

这与我最开始的猜测大致是吻合的,即dota2存在的高帧卡顿,就是类似三重缓冲造成的BUG,当帧率低于刷新率时,会在极其高的帧数里插入一帧本该丢弃的历史帧,客观角度来看,帧数很高,正常波动,但是主观上只要足够细致就是感受到高帧中带有一丝丝怪异的流畅。

当然也无需过度担心这个问题,这个现象只会出现在CPU帧率低于刷新率时,如果平均帧高于了刷新率,那么这个问题只是偶尔出现,可以忽略;如果不幸是240hz显示器或者配置不好平均帧低于刷新率,那么调低刷新率就可以避免。如果是VRR用户,在确保刷新率低于平均帧后,就别搞低于2-3帧的锁帧,建议直接5帧起步

不过以上都是针对非N卡用户。英伟达是官方正面回应过mpo问题的(三重缓冲机制),相对于其他厂商使用了默认垂直同步策略不同,既有可能专门做出了自己的优化策略。我相信通用性肯定没问题,但是在dota2里出问题了:即使保证了刷新率在平均帧以下,这个现象依旧存在,只能依靠垂直同步解决,前提还是要刷新率低于平均帧。因为我是用5060ti测试的,不确定时是架构还是驱动上的策略,猜测更多是驱动上的

cs2猜测也存在同样问题,只不过cs2平均一向比较高,再不好的配置平均帧也基本能超过刷新率,有问题的概率很低。反正起源引擎的用户,最好别盲目追求自己的高刷,或者说要确保CPU帧率能跑在刷新率以上性能时再追求高刷
coookiie-avatar

coookiie

上来基本条件就错了

垂直同步三重缓冲不是没有延迟的 而是延迟很大 但是当你的帧数能稳定达到刷新率的两倍以上时 延迟收益才是正的

所以三重缓冲任何情况下都不应该和插帧一起开

今天追求低延迟流畅 正常使用reflex加gsync加垂直同步就行了这个组合会开启reflex sync 自动获得三重缓冲两倍帧率等效的低延迟 同时不需要帧率达到要求 而且VRR会保证滚屏的流畅

你滚屏不平滑主要原因就是没有VRR
jaime-avatar

jaime

Reply to [pid=837765889,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 21:29)

关键不是三重缓冲问题,而是dx自带的预渲染帧机制,这个机制很接近三重缓冲,但在部分游戏里会出现历史帧回退现象,帧数几百都没用。至少我确定的游戏是:cs2 dota2 帧率低于刷新率时,胡闹厨房

当出现问题时,任何垂直同步方案都会没效果,包括vrr都失效了
coookiie-avatar

coookiie

[quote][pid=837766202,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 21:32):

关键不是三重缓冲问题,而是dx自带的预渲染帧机制,这个机制很接近三重缓冲,但在部分游戏里会出现历史帧回退现象,帧数几百都没用。至少我确定的游戏是:cs2 dota2 帧率低于刷新率时,胡闹厨房

当出现问题时,任何垂直同步方案都会没效果,包括vrr都失效了[/quote]开reflex

以及渲染队列不可能错帧 除非你开了插帧

关掉插帧就好了
jaime-avatar

jaime

Reply to [pid=837765889,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 21:29)

我测试过5060ti的,搭配华硕240hz显示器…
gsync没用,唯一有用的办法就是用144hz刷新率+垂直同步,缺一个条件都不行
jaime-avatar

jaime

Reply to [pid=837766285,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 21:33)

我觉得你可能没注意我第一段话:驱动里锁帧时,锁什么帧,游戏自带的内部帧率计数器都会偶尔跳高5帧,这不只是系统跟显卡问题,游戏自己也有问题

也就是说多出这5帧,只是在游戏内部问题,显卡或者驱动上是正常的输出,是游戏自己输出了历史帧
coookiie-avatar

coookiie

[quote][pid=837766336,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 21:33):

我测试过5060ti的,搭配华硕240hz显示器…
gsync没用,唯一有用的办法就是用144hz刷新率+垂直同步,缺一个条件都不行[/quote]gsync开启必须要同时开启垂直同步 否则无效

建议关闭游戏的垂直同步 从nv控制面板强制开启
coookiie-avatar

coookiie

[quote][pid=837766494,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 21:35):

我觉得你可能没注意我第一段话:驱动里锁帧时,锁什么帧,游戏自带的内部帧率计数器都会偶尔跳高5帧,这不只是系统跟显卡问题,游戏自己也有问题[/quote]不需要在乎这个问题 因为gsync会解决一切帧数浮动

多说一句 锁帧加插帧是纯粹坑自己的用法 你这个输入延迟高到等效40帧 同时还没有达到刷新率 导致额外延迟 最后手感不到30帧了

放着240hz vrr不用 非要坑自己插帧加三重缓冲高延迟加丢弃原生帧 你就别研究了 听我的去驱动开垂直同步吧
coookiie-avatar

coookiie

[quote][pid=837766494,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 21:35):

我觉得你可能没注意我第一段话:驱动里锁帧时,锁什么帧,游戏自带的内部帧率计数器都会偶尔跳高5帧,这不只是系统跟显卡问题,游戏自己也有问题

也就是说多出这5帧,只是在游戏内部问题,显卡或者驱动上是正常的输出,是游戏自己输出了历史帧[/quote]游戏无法输出历史帧 因为游戏是根据gpu ready进行渲染请求的

你这大概率就是插帧搞出来的bug 关掉插帧就行了

还是那句话 没事不要开插帧给游戏提高难度增加bug
这玩意单机rpg开开还行 网游竞技开这个纯粹坑自己坑队友
jaime-avatar

jaime

Reply to [pid=837766583,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 21:36)

你还是不懂,是系统的mpo机制本身就是一种类三重缓冲机制,即使注册表里关闭了mpo,至少对游戏层面无法去除。只要存在这个问题,VRR解决不了问题,因为显卡也好,显示器也好,接收到的帧指令都是正确的
coookiie-avatar

coookiie

[quote][pid=837767183,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 21:43):

你还是不懂,是系统的mpo机制本身就是一种类三重缓冲机制,即使注册表里关闭了mpo,至少对游戏层面无法去除。只要存在这个问题,VRR解决不了问题,因为显卡也好,显示器也好,接收到的帧指令都是正确的[/quote]MPO是硬件合成 硬件不支持游戏就无法使用
jaime-avatar

jaime

Reply to [pid=837767151,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 21:43)

所以说这个现象很奇怪也很复杂,不知道游戏、系统、显卡哪里的协调出了问题,排查来看,显卡的锅是最小的,而且A卡的最简单,只要保证刷新率低于平均帧,freesync就没问题,N卡则必须要配合垂直同步。

另外有一个非常常识性的知识点你不知道:低延迟也好、vrr也好,都是作用与gpu受限的场景,也就是GPU算力满了,他们都正常工作,如果是因为CPU(缓存)导致的帧率下降,vrr没有一点办法
jaime-avatar

jaime

Reply to [pid=837767342,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 21:45)

mpo不是问题,是mpo背后的dx预渲染帧机制。只要win11的游戏全屏是无边窗口化的伪全屏,这个机制就在工作
coookiie-avatar

coookiie

[quote][pid=837767633,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 21:48):

所以说这个现象很奇怪也很复杂,不知道游戏、系统、显卡哪里的协调出了问题,排查来看,显卡的锅是最小的,而且A卡的最简单,只要保证刷新率低于平均帧,freesync就没问题,N卡则必须要配合垂直同步。

另外有一个非常常识性的知识点你不知道:低延迟也好、vrr也好,都是作用与gpu受限的场景,也就是GPU算力满了,他们都正常工作,如果是因为CPU(缓存)导致的帧率下降,vrr没有一点办法[/quote]VRR不受gpu负载的影响 也不受CPU负载的影响

同时CPU缓存是透明的 不存在由于CPU缓存导致的帧率下降这种东西

另外dx12 swapchain Direct Flip可以走MPO也可以不走 不管走不走MPO都是不会走传统的三重缓冲的 而是允许撕裂的等效真全屏模式

我建议如果你不懂原理 也没写过图形代码 就听劝吧
jaime-avatar

jaime

Reply to [pid=837768651,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 21:59)

我建议你cs2里可以把游戏内帧率限制拉低,就极限点90帧吧,模拟cpu受限场景。你看看VRR还在工作不,当然我说的不是数字上的变化,而是流畅度,然后你GPU同样限制到90帧,你再看看流畅度

如果你觉得流畅度一致,那只能说咱们感官上有区别,你相信数字,我相信感受

另外我说的不是三重缓冲,是类三重缓冲渲染机制
coookiie-avatar

coookiie

[quote][pid=837769247,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 22:05):

我建议你cs2里可以把游戏内帧率限制拉低,就极限点90帧吧,模拟cpu受限场景。你看看VRR还在工作不,当然我说的不是数字上的变化,而是流畅度,然后你GPU同样限制到90帧,你再看看流畅度

如果你觉得流畅度一致,那只能说咱们感官上有区别,你相信数字,我相信感受

另外我说的不是三重缓冲,是类三重缓冲渲染机制[/quote]VRR当然在工作了 这一点你把显示器的VRR帧率显示打开就行了 显示器的帧率是最终硬件刷新率

CPU和gpu瓶颈的同帧率手感不一样太正常了 因为延迟并不相同

但是这没有意义 你的硬件配置决定了你能达到的最低延迟能到多少 而实现这个的方法基本上是固定的 就是VRR加垂直同步加reflex
凑巧cs2完美支持这个 但是所有电竞哥都不用这个 因为人家追求最低延迟也就是reflex加撕裂

我自己的测试是cs2最佳手感是撕裂 低分辨率维持在400帧以上 同时开启reflex
我是4k240hz的oled
jaime-avatar

jaime

Reply to [pid=837768651,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 21:59)

另外这个唯一控制这个机制的是系统游戏设置中的 游戏窗口化 功能,默认开启的,什么dx8 dx9游戏,默认都在用这个,只要开了必然走这种类三重缓冲机制。我一直说的类三重缓冲,不是三重缓冲,你先确保咱俩说的一个东西
coookiie-avatar

coookiie

[quote][pid=837770000,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 22:13):

另外这个唯一控制这个机制的是系统游戏设置中的 游戏窗口化 功能,默认开启的,什么dx8 dx9游戏,默认都在用这个,只要开了必然走这种类三重缓冲机制。我一直说的类三重缓冲,不是三重缓冲,你先确保咱俩说的一个东西[/quote]我知道你指的是direct flip 你能知道这个东西存在已经很不错了 不知道名字没关系

这东西不支持dx9 需要至少dx11
而dx12是强制开启不支持关闭的 也就是dx12游戏没有真全屏

你放心 我会写相关的代码 你听我的就行了

cs2如果能接受撕裂 就撕裂加reflex然后调低分辨率确保平时帧数高于400 最低帧数高于100 当然这需要9800x3d的支持

此时gsync必然失效

如果想要不撕裂 那垂直同步加reflex加gsync是最低延迟 此时帧数卡在235帧左右 但是延迟接近400帧水平
jaime-avatar

jaime

Reply to [pid=837770322,44945587,1]Reply[/pid] Post by [uid=1830154]MikeZTM[/uid] (2025-08-27 22:16)

我追求的是帧率波动时的画面流畅度一致性。

比如cs2远古遗迹的T出生点,中低端显卡会低于100帧,但是画面流畅(只要走出水潭就恢复正常帧率),仿佛是开了垂直同步(实际上用的是vrr)。但是当CPU引发的帧率下降,150帧-200帧流畅度远不如100hz的垂直同步,对我来说那这VRR就是失效了。当然我看你的意思是只要帧率与刷新率一致就是生效了,我有些茫然,不知道VRR意义在何,VRR是低延迟五撕裂的画面?

我还是觉得远古遗迹T出生点是个好场景,准确还原了帧率波动并不影响流畅的VRR意义。感觉你对VRR的认知有点走偏
coookiie-avatar

coookiie

[quote][pid=837771820,44945587,1]Reply[/pid] Post by [uid=1252822]OpenBox[/uid] (2025-08-27 22:31):

我追求的是帧率波动时的画面流畅度一致性。

比如cs2远古遗迹的T出生点,中低端显卡会低于100帧,但是画面流畅(只要走出水潭就恢复正常帧率),仿佛是开了垂直同步(实际上用的是vrr)。但是当CPU引发的帧率下降,150帧-200帧流畅度远不如100hz的垂直同步,对我来说那这VRR就是失效了。当然我看你的意思是只要帧率与刷新率一致就是生效了,我有些茫然,不知道VRR意义在何,VRR是低延迟五撕裂的画面?

我还是觉得远古遗迹T出生点是个好场景,准确还原了帧率波动并不影响流畅的VRR意义。感觉你[/quote]VRR当然不能解决掉帧啊 你性能不足帧数下去了 vrr只能把刷新率给你同步 保证不撕裂且不丢帧

vrr没有失效 你要搞清楚vrr是干什么用的

传统固定刷新率模式下 垂直同步掉帧就必须等下一次刷新的窗口了 撕裂就不在乎这个 直接从这一行开始输出

150-200的vrr 效果是远好于你100hz垂直同步的 当你帧数低于100的时候 你的输入延迟就等效50hz了 而vrr能保证延迟对应帧数

也就是vrr下 150帧是150帧的延迟和流畅度
200帧是200帧的延迟和流畅

而垂直同步100hz下 100帧是90帧的延迟和100帧的流畅度
99帧是45帧的延迟和50帧的流畅度

差一帧甚至差0.1帧都是明显的微卡