Application.targetFrameRate
该API设置游戏尝试使用指定的帧率进行渲染
默认情况下该值为-1,表明使用平台的默认帧率进行渲染, 帧率在各个平台有差异:
- 对于PC机,默认帧率就是机器性能上所能达到的最大帧率
- 对于移动平台,为了省电的目的,默认帧率是低于硬件能达到的最大帧率的,一般而言是30帧。事实上对于移动平台的最大可达到的帧率等于其屏幕的刷新率(比如机器的屏幕刷新率为60Hz,如果targetFrameRate设置-1的话,其最大帧率只能达到60fps)。Unity API中的Screen.currentResolution接口返回的有屏幕刷新率信息
- 另外对于移动平台targetFrameRate只能设置为-1,或者屏幕刷新率,或者屏幕刷新率被整数除后的值。否则的话,实际帧率会小于该值,等于一个小于该值最合适的值。比如某移动机器屏幕刷新率为60HZ,游戏代码中设置targetFrameRate为40,那么实际上的帧率为30
- 对于WebGL,若使用默认帧率,浏览器会选择使用能最优展示效果的帧率。为了CPU性能的考虑,建议使用一个限定值
- 在VR平台上帧率由SDK决定,targetFrameRate设置无效
另外需要知道的一个知识点:在Unity编辑器中targetFrameRate的设置只会影响Game窗口,不会影响到Editor窗口
垂直同步概念
1.垂直同步是什么?
垂直同步(Vertical Sync),从CRT显示器的显示原理来看,单个像素组成了水平扫描线,水平扫描线在垂直方向的堆积形成了完整的画面。显示器的刷新率受显卡DAC控制,显卡DAC完成一帧的扫描后就会产生一个垂直同步信号。我们平时所说的打开垂直同步,指的是将该信号送入显卡3D图形处理部分,从而让显卡在生成3D图形时受垂直同步信号的制约。
2.垂直同步的作用是什么?
垂直同步的作用:避免画面出现“撕裂”的现象。(因为画面的渲染不是整个画面一起渲染的,而是逐列或逐行渲染的。在关闭垂直同步时,如果电脑配置不够,画面在高速移动过程中会出现一个画面还没渲染完成就开始进行下一个画面的渲染,从而产生的“撕裂”。)
3.是否启用垂直同步的区别?
我们平时用的电脑显示器,一般屏幕的刷新率都是80HZ上下(一般来讲刷新率要达到75HZ以上,人眼才不易感觉出屏幕闪烁),那么显卡会按照每秒80HZ来发送一个垂直同步信号。
开启垂直同步:显卡绘制完一屏图像后,需要等待80HZ垂直同步信号的到达,才可以开始绘制下一屏。这样游戏自然受到刷新率运行的制约。
关闭垂直同步:那么游戏中显卡绘制完一屏图像后,显卡和显示器无需等待垂直同步信号达到,就可以开始下一屏的绘制,展示了显卡的实例。
所以,正是因为垂直同步的存在,才能使游戏进程和显示器刷新率同步,使得画面平滑和稳定。关闭垂直同步,虽然可以换来更快的速度,但是在图像的连续性上,性能必然会大打折扣。
4.关于画面撕裂
显示设备上的图像更新并不是连续性的,而是类似Unity的帧一样更新的。然而,Unity的更新不一定与显示设备的更新同步,所以有可能Unity 提交了新的一帧图像,而显示设备仍显示前一帧图像。这会导致发生变换的屏幕位置出现“撕裂”的现象。
Unity中设置垂直同步
点击Unity->Edit->Project Setting->Quality,打开QualitySetting面板,有一个VSync Count参数,该参数表示垂直同步。它有三个值可以选择:
- Don’t Sync
- Every V Blank
- Every Second V Blank
同样也可以使用代码QualitySettings.vSyncCount来设置
需要注意的是,若开启了垂直同步的设置(编辑器中VSync Count不为Don’t Sync或者代码设置vSyncCount>0)的话,那么targetFrameRate的设置则会无效。
开启了垂直同步的话,会使用平台的默认渲染帧率和vSyncCount来决定最终最大的渲染帧率。比如某平台的默认渲染帧率为60fps,vSyncCount设置为2。那么最终目标渲染帧率为60/2=30fps。
iOS设备对画面的展示是硬件级上的垂直同步,即Unity的垂直同步设置对其无效。iOS设备上可以通过targetFrameRate的设置来改变帧率,前文中已经介绍了移动设备中targetFrameRate的设置和其最终帧率的规则。由于目前iOS设备基本上都是60HZ,因此在iOS设备上生效的帧率有60、30、15
另外最终游戏的运行帧率还要考虑到游戏的性能问题、机器的配置问题等等。对于性能有问题的游戏,帧率可能会很低,远远达不到设置的帧率。
帧率高的话,那么在相同时间内就会渲染更多的画面,消耗更多的CPU和电能。因此项目中需要根据情况进行合适的设置