关注

移动平台游戏运行在30和60帧之间时发生画面抖动

问题
 
您可能会注意到以下现象:
  • 您的游戏运行在60帧(FPS)或以上时,突然遇到数帧有明显卡顿延迟感,致使帧率降至30。
  • 使用Profiling工具分析低FPS采样帧时,发现WaitForPresent或Overhead莫名占用过多处理时间。
  • 如果您使用自己编写的帧率计算方法,您会发现某些帧的帧率会大幅下降,或平均保持在45帧。
原因
 

简短地说,在iOS与Android平台上,您只能让程序运行在60帧、30帧以及30帧以下。因为在移动平台上,系统为渲染强制启用垂直同步(Vertical Synchronization)。

专业解释如下:iOS和Android设备的最高屏幕刷新率(Update Frequency)是60Hz(60FPS),即画面的每秒渲染速率不会超过60帧。与其他平台不同,您无法解除这个限制,这样做能保证您程序的运行效率。

Android和iOS设备使用垂直同步技术,以固定的时间间隔刷新画面。也就是说,在显示一帧的时间单位内,画面不会中途改变。渲染内容的变化仅发生在两次屏幕刷新之间,这可以避免画面撕裂现象(Screen Tearing Effect)。

垂直同步还会产生另一种现象:如果您的游戏没能在显示下一帧前准备好帧缓冲区(Frame Buffer),系统会重复渲染一次已有的帧缓冲内容,即跳过当前帧。然后,Unity在下次画面刷新前继续准备帧缓冲区。按照这个过程运行下去,最终展现的结果是30帧的画面帧率,因为帧缓冲仅能在隔一帧被更新。

这也说明了为什么移动平台游戏的运行帧率必须能被屏幕刷新率(60Hz)整除。

解决方案
 
有以下两种办法:
1.优化您的游戏,使运行速率高于(或等于)60帧。
2.限制画面帧率30帧,向Application.targetFrameRate赋值30即可。
 
这篇文章有帮助吗?
1 人中有 1 人觉得有帮助
还有其它问题?提交请求

1 评论

  • 0
    Avatar
    Lic

    抖动的原因是因为刷新率固定所以当其他帧率都是60FPS的时候有一帧没准备好buffer,就瞬间降低到30FPS的原因导致的吗

登录写评论。