iOS卡顿中的hangs和hitches都是什么意思

5 阅读4分钟

以下内容,来自AI。

在 iOS 性能监控和卡顿治理中,Hangs(挂起)Hitches(顿挫 / 卡顿) 是两个核心概念。虽然它们都表现为 App 不流畅,但在严重程度、持续时间、底层原因以及用户感知上有本质区别。

苹果在 Xcode 15 和 iOS 17 中引入了全新的 MetricKit 2.0,正式标准化了这两个指标。

以下是详细的对比和解读:


一、 核心定义区别

1. Hitches (顿挫 / 轻微卡顿)

  • 定义:指屏幕渲染的帧(Frame) 显示时间晚于预期的 VSync(垂直同步信号) 信号。

  • 通俗理解:App 没有卡死,还在动,但是掉帧了,滑动不丝滑,肉眼能感觉到 “不流畅”。

  • 关键指标Hitch Time Ratio (HTR)Hitch Rate

    • 单位通常是 ms/s(每秒钟内的卡顿总时长)。
    • 例如:5 ms/s 意味着每滑动 1 秒钟,有 5 毫秒是卡顿的。
  • 主要场景

    • 滑动列表(UITableView / UICollectionView)。
    • 页面过渡动画。
    • 复杂的 UI 绘制。

2. Hangs (挂起 / 严重卡死)

  • 定义:指主线程(Main Thread)在长时间内无法响应事件(如触摸、系统回调)。

  • 通俗理解:App 完全卡住不动了,点什么都没反应,像 “死机” 了一样。如果持续时间过长(通常超过 4-5 秒),用户可能会触发 “白屏” 或 App 被系统强杀。

  • 关键指标Hang Rate

    • 单位通常是 s/h(每小时内的挂起总秒数)。
    • 例如:0.5 s/h 意味着平均每小时用户使用中,主线程会阻塞 0.5 秒。
  • 主要场景

    • 启动时的大量同步 IO 或计算。
    • 主线程执行复杂的 JSON 解析。
    • 主线程进行网络请求(同步)。
    • 死锁(Deadlock)。

二、 深度对比表

维度Hitches (顿挫)Hangs (挂起)
严重程度中等 (影响体验)严重 (影响可用性,甚至导致崩溃)
持续时间毫秒级 (通常 < 200ms)秒级 (通常> 250ms,甚至数秒)
用户感知掉帧、滑动不跟手、动画掉步界面冻结、点击无响应、可能看到系统白屏
技术本质渲染流水线 慢了(CPU/GPU 渲染耗时 > 16.6ms)主线程 RunLoop 停滞了(事件循环未完成)
监控阈值通常关注 >10ms 的帧延迟通常关注 >200ms 或 >500ms 的阻塞
优化优先级 (为了极致体验)最高 (为了 App 稳定性)

三、 技术层面的底层原因

1. 为什么会产生 Hitches?

Hitches 主要发生在渲染阶段。iOS 屏幕刷新率通常是 60Hz(每 16.67ms 一张图)或 120Hz(每 8.33ms 一张图)。

  • 原因:CPU 在准备图层(Layout, Display)或 GPU 在合成(Render)时,耗时超过了一帧的时间。

  • 结果:系统为了不撕裂画面,会丢弃当前帧,直接显示下一帧。用户看到的就是画面跳过了一格。

  • 典型代码

    • cellForRowAtIndexPath 里做了复杂的 layoutIfNeeded
    • 图片解码没有异步处理。
    • 大量的离屏渲染(Offscreen Rendering)。

2. 为什么会产生 Hangs?

Hangs 主要发生在主线程任务执行阶段

  • 原因:主线程的 RunLoop 在处理某个 Source 或 Timer 时,执行了一个耗时极长的同步任务,导致 RunLoop 无法进入下一次循环去处理用户的触摸事件。

  • 结果:系统 Watchdog 机制可能会检测到主线程无响应。

  • 典型代码

    • viewDidLoad 里写了 [NSData dataWithContentsOfURL:](同步读网络)。
    • 复杂的 SQL 查询在主线程执行。
    • 加锁逻辑不当导致的死锁。

四、 如何监控与治理

1. Hitches 治理

  • 工具:Xcode Instruments 中的 Core Animation (看 FPS) 或 Metrics Organizer

  • 优化方向

    • UI 优化:减少视图层级,简化 AutoLayout。
    • 异步渲染:图片异步解码。
    • 预排版:在后台线程计算好 Frame 或 AttributedString。

2. Hangs 治理

  • 工具:Xcode Instruments 中的 Time Profiler (看 CPU 热点) 或 Main Thread Checker

  • 优化方向

    • 主线程减负:任何耗时操作(IO、计算、网络)必须扔到子线程。
    • 启动优化:启动任务异步化、懒加载。
    • 死锁排查:检查多线程加锁逻辑。

总结

  • Hitches“慢”:App 还在跑,只是跑得不顺畅(掉帧)。
  • Hangs“停”:App 彻底卡住了,主线程阻塞了。

在做性能指标设定时,Hangs 是底线(必须极低),Hitches 是上限(决定体验好坏)。

苹果官方文档

  1. understanding-hangs-in-your-app
  2. understanding-hitches-in-your-app