Board logo

标题: [专题讨论] 谈一谈个人对fast sync和延迟的见解 [打印本页]

作者: samusialan    时间: 2016-8-11 14:12     标题: 谈一谈个人对fast sync和延迟的见解

最近对这个很感兴趣,查了些资料,因为不是专业的人,只能说分享一下尽自己能力理解的情况,有错的地方还请谅解和纠正
碰巧“燕市游徒”分享了其他显卡开启方法,并觉得或许对模拟器有效,所以就在这区分享吧,不放数码区了,那里最近对这类话题好像很反感的样子

一句话总结:fast sync应该是一种相对完美的多重缓冲技术
为什么nv会在这个时候放出这个技术呢?根源估计要从麦克斯韦架构说起,这个架构不但大量增加了内部各环节的缓存(缓冲?)区,而且还加入了一项技术——重复利用帧缓存的内容。使得fast sync有了完全的硬件基础,同时这些东西还被用于帕斯卡这代的VR等内容的性能提升上(重复利用帧缓存的内容,理论上极限可以提速接近一倍)

下面我用一个理想化的例子(同一个显卡渲染A、B、C、D四帧画面)去详解一般情况、三重缓冲以及fast sync的运作模式,同时解释延迟的产生
显示器我们先从最普通的60Hz刷新率说起,也就是说其图像刷新周期是16ms(不是液晶的延迟)

首先是一般情况下,显卡开始处理A帧
显示器刷新周期1,A帧已经处理完成了,正常刷新,这时延迟是16ms,开始处理B帧
显示器刷新周期2,B帧没有处理完,如果这时强制刷新则画面会出现撕裂,所以我们开启垂直同步避免画面撕裂(下同),因为垂直同步的关系显示器继续刷新A帧的图像
显示器刷新周期3,B帧已经处理完成了,正常刷新,这时延迟是33ms(2个刷新周期才出这帧图像),开始处理C帧
显示器刷新周期4,C帧没有处理完,继续刷新B帧图像
显示器刷新周期5,C帧没有处理完,继续刷新B帧图像
显示器刷新周期6,C帧没有处理完,继续刷新B帧图像
显示器刷新周期7,C帧已经处理完成了,正常刷新,这时延迟是67ms(4个刷新周期才出这帧图像),开始处理D帧
显示器刷新周期8,D帧没有处理完,继续刷新C帧图像
显示器刷新周期9,D帧已经处理完成了,正常刷新,这时延迟是33ms(2个刷新周期才出这帧图像)
A、B、C、D四帧分别需要1、2、4、2个显示器刷新周期去处理,延迟分别是16ms,33ms,67ms,33ms

接下来我们看三重缓冲,显卡开始处理A、B两帧
显示器刷新周期1,A帧已经处理完成了,正常刷新,这时延迟是16ms,原A帧的缓冲开始处理C帧
显示器刷新周期2,B帧没有处理完(虽然2个显示器刷新周期能处理好B帧,但前1周期部分性能用于处理A帧了),继续刷新A帧的图像。这里为方便大家理解加入一个理想化的每帧已处理比例(B:0.8  ;  C:0.2)
显示器刷新周期3,B帧已经处理完成了,正常刷新,这时延迟是33ms,原B帧的缓冲开始处理D帧。(B:1.0  ;  C:0.5  ; D:0.0)
显示器刷新周期4,C帧没有处理完,继续刷新B帧图像。(C:0.7  ;  D:0.4)
显示器刷新周期5,C帧没有处理完,继续刷新B帧图像。(C:0.9  ;  D:0.8)
显示器刷新周期6,C帧已经处理完成了,正常刷新,这时延迟是50ms。(C:1.0  ;  D:1.0)
显示器刷新周期7,D帧已经处理完成了,正常刷新,这时延迟是16ms
延迟分别是16ms,33ms,50ms,16ms

最后我们看fast sync,A、B、C、D四帧全部进入处理列队
显示器刷新周期1,A帧已经处理完成了,正常刷新,这时延迟是16ms
显示器刷新周期2,B帧已经处理完成了(重复利用A帧,有40%以上内容不需要处理),正常刷新,这时延迟是16ms
显示器刷新周期3,D帧已经处理完成,刷新D帧图像,C帧因为没及时完成直接抛弃(三重缓冲D帧比C帧先完成也会抛弃C帧),这时延迟是16ms
延迟分别是16ms,16ms,16ms

优劣通过这个理想化的例子很明显的展示了出来
至于不是这些架构的显卡开启fast sync我就不太清楚是怎么运作的了,估计效果比较接近三重缓冲的情况,但即便是这样也很好了,因为不是什么游戏或模拟器都支持三重缓冲的,理论上A卡应该也能做到这样,看看AMD会不会跟进这个

接下来顺便聊一聊相关的其他技术

144Hz液晶显示器
上面的例子我们不难发现A帧说不定连一半的显示器刷新周期都不到就能处理完成,然而有显示器刷新周期的限制在依然要等显示器刷新,这时144Hz就有用了,7ms的刷新周期让部分帧延迟进一步降低

G-sync
这个和上面是完全不同的东西,上面所有情况都是显示器刷新周期固定不变,显卡去配合显示器。而G-sync则是改变显示器刷新周期去配合显卡
比如一个游戏能够完全稳定在59帧不变,在普通显示器上开垂直同步,其延迟是33ms,而在G-sync显示器上则是17ms

FreeSync
FreeSync和G-sync是一样的,但硬件标准不同,FreeSync只能在显示器可能的范围内实现G-sync的功能而已
作者: clarkh    时间: 2016-8-11 14:26

从楼主描述看fastsync的重点是重复利用上一帧已缓存的东西,但是这个是完全和编程方式无关的,还是说写图像显示的部分需要有意识的脏矩形化更新帧?3d的我就不清楚了,单从2d说呢。

不过谢谢楼主让我理解了三重缓冲,以前就只是单纯以为一次性预处理三帧。
作者: sig1b    时间: 2016-8-11 14:41

太棒了!这么说用这个技术的模拟器可以比原真实街机提前发招(16ms)?以前玩街机总觉得对手(ai)都后发先至。
作者: samusialan    时间: 2016-8-11 14:45

那种技术应该是和隐面消除技术同源的,更具体我也不懂了
至于三重缓冲。一般的情况下缓冲有两个,一个用于存储处理中的图像,完成后复制到第二个缓冲中,第二个缓冲和显示器做直接交换,三重缓冲多加一个用于存储处理中图像的缓冲,所以才有“三”的说法
作者: 燕市游徒    时间: 2016-8-11 15:36

960不能完全运用fast sync?晕。
作者: SONIC3D    时间: 2016-8-11 16:00

LZ,我感觉你最好重新理解什么是三重缓冲,尤其是
"显示器刷新周期4,C帧没有处理完,继续刷新B帧图像。(C:0.7  ;  D:0.4)"
"三重缓冲D帧比C帧先完成也会抛弃C帧"
这两个想法

然后你就会开始理解fast sync本质是解除了多重(不局限于三重)缓冲中的一个问题,这个问题在显卡机能爆表到帧渲染频率远高于显示器刷新频率能力时才会发生。


[ 本帖最后由 SONIC3D 于 2016-8-11 16:11 编辑 ]
作者: SONIC3D    时间: 2016-8-11 16:05

附图:https://en.wikipedia.org/wiki/Multiple_buffering
作者: lvcha    时间: 2016-8-11 17:09

posted by wap, platform: Firefox
学习下。
这个主要是免费的,不错
作者: samusialan    时间: 2016-8-11 17:44

感谢“SONIC3D”指点,不过单靠我个人估计还是想不通,是指我理解的“三重缓冲会弃帧“这点吗?
比如wiki那张图的第5个B的处理时间如果是图中的3倍,然后C已经完成了,那么第三次刷新周期是怎么运作的?
而常见比较容易理解的fast sync和三重缓冲最重要的区别描述是,fast sync会拾取最接近实际时间点的一帧输出

模拟器发招不会比实机延迟低吧,这里只是图形处理和显示器输出的延迟,另外还有模拟器本身的延迟、液晶显示器的延迟以及输入设备的延迟还没算进去
作者: jqnwow    时间: 2016-8-11 18:45

N年前魔兽世界的“降低画面延迟”是不是也是这个技术?开了之后画面帧数有所降低,但转动视角非常跟手。
作者: SONIC3D    时间: 2016-8-11 19:16

引用:
原帖由 samusialan 于 2016-8-11 17:44 发表
1.......是指我理解的“三重缓冲会弃帧“这点吗?
2.比如wiki那张图的第5个B的处理时间如果是图中的3倍,然后C已经完成了,那么第三次刷新周期是怎么运作的?
3.而常见比较容易理解的fast sync和三重缓冲最重要的区别描述是,fast sync会拾取最接近实际时间点的一帧输出
1.你Windows上应用里或驱动里启用三重缓冲时,当渲染结果占用了显示buffer以外的2个buffer后,如果vsync还没有发生,那么就阻塞了,不再进行下一个周期的渲染。(但是严格来说3dfx的三缓冲不是这样做,而是像你说的这那样干的,这个看下面第3点)


2.B和C根本不会同时开始,是顺序进行,也就是我蓝字里帮你划出来的,具体也可以参考我上面的附图。

3.Fast sync就是3dfx的三缓冲机制的再包装,与现在的三缓冲的本质区别就是当渲染速度极快、所有后备缓冲都被填充完之后,也不会被阻塞住,游戏可以继续往后备缓冲中填充渲染结果,而当显示器vsync发生时,只会从"最后渲染完毕"的那个缓冲中复制画面到显示缓冲。也就是极端高速渲染的情况下,会出现你说的"弃贞"。这样的机制,最大的优势就是在"v-sync等待"开关关闭的状态下也能取得不横向撕裂的画面,而且是尽可能接近最新渲染结果的画面。

[ 本帖最后由 SONIC3D 于 2016-8-11 20:41 编辑 ]
作者: SONIC3D    时间: 2016-8-11 20:45

引用:
原帖由 sig1b 于 2016-8-11 14:41 发表
太棒了!这么说用这个技术的模拟器可以比原真实街机提前发招(16ms)?以前玩街机总觉得对手(ai)都后发先至。
我以前也有这种感觉,然后发觉是我用了重拳,电脑用了轻拳。

作者: samusialan    时间: 2016-8-11 21:00

引用:
原帖由 SONIC3D 于 2016-8-11 19:16 发表
1.你Windows上应用里或驱动里启用三重缓冲时,当渲染结果占用了显示buffer以外的2个buffer后,如果vsync还没有发生,那么就阻塞了,不再进行下一个周期的渲染。(但是严格来说3dfx的三缓冲不是这样做,而是像你说 ...
再次感谢解答,我居然忽视那张图的三重缓冲依然是顺序执行的,难怪怎么想都想不通错在哪里,我一直以为三重缓冲是同时执行的
作者: clarkh    时间: 2016-8-11 23:40

引用:
原帖由 samusialan 于 2016-8-11 21:00 发表

再次感谢解答,我居然忽视那张图的三重缓冲依然是顺序执行的,难怪怎么想都想不通错在哪里,我一直以为三重缓冲是同时执行的
所以简单来说,显卡只能同时渲染一帧,只不过可以多放几个缓冲区用来交换,那么理论上如果显卡足够快,十重缓冲都是可以的咯……
作者: SONIC3D    时间: 2016-8-12 03:32

引用:
原帖由 clarkh 于 2016-8-11 23:40 发表

所以简单来说,显卡只能同时渲染一帧,只不过可以多放几个缓冲区用来交换,那么理论上如果显卡足够快,十重缓冲都是可以的咯……
是的,DirectX里就有这个
https://msdn.microsoft.com/en-us/library/windows/desktop/bb174347(v=vs.85).aspx
DX9最多允许20个,DX10-12我记得最多16个,具体这个队列值是多大,可以通过上面这个api设置。

但这依然是个队列,队列中的任何一片缓冲,都不会被抛弃,会依次复制到显示缓冲显示到屏幕上。并且假设真有一块显卡渲染特别快,在2个VSync之间就把最多20个的队列都填满了,那么也依然会阻塞住,等待有新的队列位置空出来,所以依然会造成"延迟"。并且可以这样说,你这个队列越长,只能在一定条件下使整个渲染过程的平均渲染间隔时间趋于稳定(开VSync等待的情况下),但队列的拖长也造成了画面渲染后,被延迟了较长时间才显示到屏幕上。

这和3dfx的三重缓冲和fast sync的只取最后完整渲染的一帧的做法所产生的结果是完全不一样的。
作者: samusialan    时间: 2016-8-12 12:08

我记得UBI接手后的孤岛惊魂就能设置多5个缓冲(不知道是不是每一款都可以)
不过现在理解了再看,用处不是很大啊,多加1个缓冲对空闲的利用率已经非常高了,再继续增加估计也就是对帧生成时间极其不稳定的游戏有些用而已,可像辐射4这种游戏又不一定就给你这样的设置,这时fast sync就有用了
作者: xu33    时间: 2016-8-12 17:29

posted by wap, platform: Chrome
970可以开fast sync吗
作者: samusialan    时间: 2016-8-12 17:50

引用:
原帖由 xu33 于 2016-8-12 17:29 发表
posted by wap, platform: Chrome
970可以开fast sync吗
开启方法还是看“燕市游徒”的贴子吧
http://club.tgfcer.com/thread-7236320-1-1.html




欢迎光临 TGFC Lifestyle (http://tgfcer.com/) Powered by Discuz! 6.0.0