最近在做UI页面拖拽优化的时候,发现一个问题,是列表还是项目中的地图,在拖拽过程中,几秒钟就可能顿一下闪一下。查了查,可能是因为垂直同步关闭导致的画面撕裂,看了看Edit--Project Settings--VSync Count,确实是关掉了垂直同步。
垂直同步在我印象里一直是用于优化CPU耗时的条目之一,但对垂直同步开关的影响反而一知半解。https://zhuanlan.zhihu.com/p/127974083 因此了解垂直同步在做什么,垂直同步开关各有什么影响,就很重要。
垂直同步:
1.刷新率和帧率
刷新率指的是显示器的刷新率,60Hz就是屏幕一秒会刷新60次画面。
缓冲区是显卡的缓冲区,显卡渲染好一张画面就会把画面存储在显卡的显存中,储存之后再去渲染下一张画面,显卡每秒钟产生120张画面也就是1/120秒就有一张画面放进缓冲区,下一个1/120秒,新的画面会给取代掉,这也就是帧数的概念。
显示器刷新率和显卡帧率不同步就会画面撕裂。
2.垂直同步
打开垂直同步后,当显示器尚未完成一帧画面刷新时候,前后缓冲区不允许交换,显示器刷新完一帧画面时,缓冲区才可以进行交换,不会在上一帧画面未显示完全就开始显示下一帧造成画面撕裂,也就是显卡画面刷新速度等待显示器刷新速度,使画面更流畅。
但是,帧率比显示器刷新率高很多的情况下,为了将显示器的刷新速度和显卡向缓冲区写入画面的时间保持同步,就要增加延迟,延迟“过快的生成画面”向显示器的输出,就会造成一定程度影像传输和操作反馈的延迟。这对需要快速反应的竞技类游戏是致命的。
3.关闭VSync是CPU优化最直接的一个方法,在Profiler中可以看到VSync占了很大比重
4.VSync关闭之后可以提高帧速率,但是画面可能会不连续。
只要有显卡,有显示器的设备都涉及到垂直同步,查看NVIDEIA控制面板可以看到垂直同步选项,而且有其介绍
关闭垂直同步
允许GPU不受刷新率限制进行渲染,并可以在单个刷新间隔对多个渲染帧进行扫描输出,会产生画面撕裂
开启垂直同步
限制GPU最大渲染速率为显示器的最大刷新率,并防止撕裂,但是由于渲染速率受限,延时可能较长且性能较低。另外,如果GPU渲染速率低于刷新率
所以开关垂直同步各有其利弊,要依项目运行需求来开关,在游戏中当然是可以给用户提供这个开关以选择性能和画面连续性。