27.Unity机制垂直同步等待问题

27.性能优化-Unity机制问题-垂直同步带来的等待


27.1 知识点

垂直同步的作用

未开启垂直同步时,游戏可能在显示器还没完成当前帧刷新时就输出下一帧图像,导致屏幕上下部分显示不同画面,即「画面撕裂」。垂直同步会强制显卡等显示器刷新完成后再提交下一帧,从而避免撕裂。

但它可能带来一些副作用:

  1. 输入延迟增加
    游戏被迫等待显示器信号再输出画面,图像延迟会让操作感觉迟钝。

  2. 帧率下降
    若帧率无法稳定在刷新率水平,垂直同步会强行把帧率降到下一个可整除值(例如从 60 降到 30 FPS),造成明显卡顿。

因此是否开启垂直同步要根据实际情况决定,例如:

  • 对画面撕裂特别敏感的游戏(如第三人称 3D、赛车等)
  • 游戏帧率远高于显示器刷新率、容易撕裂的情况
  • 对输入延迟不特别敏感的项目

垂直同步影响帧率具体分析

显示器通常以固定频率刷新(如 60Hz 表示每秒 60 次,每帧约 16.67ms),而游戏渲染速度往往不固定,有时快于、有时慢于刷新。垂直同步(VSync)会强制游戏等显示器准备好再提交新帧,避免撕裂。

这可能带来两个结果:

  1. 游戏渲染太快:需要等待下一次垂直消隐再提交,帧率会被「压」下来。
  2. 游戏渲染太慢:只能跳过本帧、延后一轮提交,帧率也会降低。

影响帧率主要有两种情况:

  1. 游戏帧率略高于刷新率,会强制等待
    例如游戏能跑 90 FPS,显示器 60Hz;开启垂直同步后,只能每 16.67ms 提交一帧,实际被「卡」在 60 FPS。

  2. 游戏帧率低于刷新率,会被「降档」
    例如游戏只能 50 FPS,显示器 60Hz;垂直同步要求帧率与刷新率成整数倍关系,于是会被降档到 30 FPS(60 ÷ 2),造成严重卡顿或掉帧感。

也就是说,开启垂直同步可能带来帧率下降。若这种下降影响体验,应谨慎使用;尤其当游戏帧率低于显示器刷新率时,可以不开启垂直同步。

Unity中如何设置垂直同步开关

1. 代码控制

QualitySettings.vSyncCount = 0;
  • 0:关闭垂直同步
  • 1:每帧同步(Every V Blank)
  • 2:隔一帧同步(Every Second V Blank)

2. 编辑器中设置

Edit > Project Settings > Quality,在 Rendering 下找到 VSync Count

  • Don’t Sync(0):关闭 VSync
  • Every V Blank(1):每次垂直同步(默认)
  • Every Second V Blank(2):隔一帧同步,帧率更低

使用垂直同步时的注意事项

开发调试时
通常关闭垂直同步,便于观察真实的 GPU 性能瓶颈。

低端机运行卡顿时
关闭垂直同步可减少因帧率被锁死带来的卡顿感。

正式发包时

  • 帧率较高的项目可以开启垂直同步防止画面撕裂(如主机、VR 等高帧率项目)
  • 帧率较低的项目可以关闭垂直同步,避免降档
  • 或将 VSync 开关交给玩家在设置里自行选择

使用垂直同步时应注意:

  1. 尽量保证帧率 ≥ 显示器刷新率
    若帧率低于刷新率,会触发降档(如 60Hz 下从 60 掉到 30 FPS),导致明显卡顿。建议至少稳定在刷新率(如 60Hz)以上。

  2. 避免频繁掉帧或波动
    帧率波动容易触发降档,体验会断崖式变差。可用 Application.targetFrameRate = 60 等方式配合稳定帧率。

  3. 考虑不同设备的刷新率
    玩家显示器可能是 60Hz、75Hz、120Hz、144Hz、165Hz 等。若逻辑写死为固定帧率(如 60 FPS),在高刷新率设备上可能出问题,应尽量基于 Time.deltaTime 做帧率无关逻辑。

  4. 注意输入延迟
    VSync 会让 GPU 等显示器信号再提交帧,会增加输入延迟(低帧率时更明显)。射击、格斗等对响应要求高的游戏需谨慎使用。

  5. 与平台特性/设置协调
    部分平台默认强制开启 VSync(如某些安卓设备);部分平台(如 PC)允许玩家在显卡驱动里控制 VSync。开发时建议在设置菜单中暴露 VSync 选项,让玩家按需开启/关闭。

等等。


27.2 知识点代码

Lesson27_性能优化_Unity机制问题_垂直同步带来的等待.cs

public class Lesson27_性能优化_Unity机制问题_垂直同步带来的等待
{
    #region 知识点一 垂直同步的作用

    /*
     * 未开启垂直同步时,游戏可能在显示器未完成当前帧刷新时就输出下一帧,导致画面撕裂。
     * 垂直同步会强制显卡等显示器刷新完成后再提交下一帧,从而避免撕裂。
     * 副作用:输入延迟增加、帧率下降(无法维持刷新率时会降档,如 60 → 30 FPS)。
     * 应根据实际情况使用:对撕裂敏感、帧率远高于刷新率、对输入延迟不敏感的项目等。
     */

    #endregion

    #region 知识点二 垂直同步影响帧率具体分析

    /*
     * 显示器以固定频率刷新(如 60Hz,每帧 16.67ms),游戏渲染速度不固定。
     * VSync 强制等显示器准备好再提交新帧。
     * 渲染太快 → 被等待压帧;渲染太慢 → 跳帧延后提交。
     * 帧率略高于刷新率 → 被卡在刷新率;帧率低于刷新率 → 降档(如 50 FPS @ 60Hz → 30 FPS),造成卡顿。
     * 若帧率下降影响体验,建议谨慎使用;帧率低于刷新率时可关闭垂直同步。
     */

    #endregion

    #region 知识点三 Unity中如何设置垂直同步开关

    /*
     * 代码:QualitySettings.vSyncCount = 0(关闭)/ 1(每帧同步)/ 2(隔一帧同步)。
     * 编辑器:Edit > Project Settings > Quality > Rendering > VSync Count。
     * Don't Sync(0)、Every V Blank(1)、Every Second V Blank(2)。
     */

    #endregion

    #region 知识点四 使用垂直同步时的注意事项

    /*
     * 开发调试:通常关闭 VSync 观察真实 GPU 瓶颈。
     * 低端机卡顿:关闭 VSync 减少帧率锁死卡顿。
     * 正式发包:高帧率项目可开启防撕裂;低帧率项目可关闭避免降档;或交给玩家在设置中选择。
     * 注意:确保帧率 >= 刷新率、避免帧率波动、考虑不同设备刷新率、注意输入延迟、与平台/设置协调,设置菜单暴露 VSync 选项等。
     */

    #endregion
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏