iOS 开发高手课
戴铭
前滴滴出行技术专家
42934 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
用户故事 (1讲)
iOS 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

13 | 如何利用 RunLoop 原理去监控卡顿?

使用第三方库来获取堆栈信息
获取堆栈信息的一种方法
开启一个子线程监控
创建 CFRunLoopObserverContext 观察者
根据当前 RunLoop 的状态来判断是否需要走下一个 loop
RunLoop 被唤醒后就要开始处理消息了
唤醒时通知 Observer
进入休眠后,会等待 mach_port 的消息,以再次唤醒
回调触发后,通知 Observers
开启一个 do while 来保活线程
通知 observers
RunLoop 的目的
RunLoop 的实现
RunLoop 的作用
通过监控 RunLoop 的状态来判断是否会出现卡顿
导致卡顿问题的几种原因
卡顿问题对App的伤害
面对问题的响应速度
监控卡顿的重要性
为什么要将卡顿监控放到线上做
如何获取卡顿的方法堆栈信息?
如何检查卡顿?
loop 的六个状态
RunLoop 的原理
RunLoop 原理
监控卡顿的方案
监控卡顿问题
小结
如何利用 RunLoop 原理去监控卡顿?

该思维导图由 AI 生成,仅供参考

你好,我是戴铭。今天,我来和你说说如何监控卡顿。
卡顿问题,就是在主线程上无法响应用户交互的问题。如果一个 App 时不时地就给你卡一下,有时还长时间无响应,这时你还愿意继续用它吗?所以说,卡顿问题对 App 的伤害是巨大的,也是我们必须要重点解决的一个问题。
现在,我们先来看一下导致卡顿问题的几种原因:
复杂 UI 、图文混排的绘制量过大;
在主线程上做网络同步请求;
在主线程做大量的 IO 操作;
运算量过大,CPU 持续高占用;
死锁和主子线程抢锁。
那么,我们如何监控到什么时候会出现卡顿呢?是要监视 FPS 吗?
以前,我特别喜欢一本叫作《24 格》的杂志,它主要介绍的是动画片制作的相关内容。那么,它为啥叫 24 格呢?这是因为,动画片中 1 秒钟会用到 24 张图片,这样肉眼看起来就是流畅的。
FPS 是一秒显示的帧数,也就是一秒内画面变化数量。如果按照动画片来说,动画片的 FPS 就是 24,是达不到 60 满帧的。也就是说,对于动画片来说,24 帧时虽然没有 60 帧时流畅,但也已经是连贯的了,所以并不能说 24 帧时就算是卡住了。
由此可见,简单地通过监视 FPS 是很难确定是否会出现卡顿问题了,所以我就果断弃了通过监视 FPS 来监控卡顿的方案。
那么,我们到底应该使用什么方案来监控卡顿呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

RunLoop原理及卡顿监控是iOS开发中的重要概念。RunLoop用于监听输入源并进行调度处理,通过监控其状态可以判断是否会出现卡顿。了解RunLoop原理不仅有助于监控卡顿,还能提高用户交互体验。文章通过CFRunLoop的源码分析了RunLoop的工作原理,包括进入loop、保活线程、进入休眠、等待唤醒、唤醒后处理消息、判断是否需要走下一个loop等过程。监控RunLoop的状态,特别是进入睡眠前和唤醒后的两个loop状态,可以帮助判断主线程是否受阻,从而判断是否会出现卡顿问题。此外,文章还介绍了如何设置合理的监控时间值以及如何获取卡顿的方法堆栈信息。通过监控卡顿并收集信息,开发者可以及时解决卡顿问题,提升用户体验。同时,文章强调了线上监控卡顿的重要性,以便更大范围地收集问题并提前预见潜在的影响。通过对RunLoop原理和卡顿监控的全面介绍,读者可以更好地理解和应用这些技术,提升应用的稳定性和性能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《iOS 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(56)

  • 最新
  • 精选
  • Keep-Moving
    PLCrashReporter怎么和卡顿检测结合起来呢?我理解它是收集崩溃信息的,但卡顿又不是一定会崩溃

    作者回复: 卡顿后收集造成卡顿的原因

    2019-04-09
    2
    15
  • Wechat Team
    文章提到可以『直接调用系统函数』来获取堆栈,但是通过注册那几个信号的方式获取堆栈,一般不是在闪退的情况下才可以触发回调吗? 请老师指点

    作者回复: 获取堆栈的方法任何时候都可以调的。闪退只是一个时机

    2019-04-10
    3
  • 鹏哥
    老师,请问下,如果我在用户滑动界面的时候不去加载图片,等停止滑动的时候再去加载图片,这个场景用runloop或者scrollview的代理来实现,和使用sdwebimage异步下载图片有什么区别,这几种方式貌似都没有影响用户滑动体验!

    作者回复: 图片少感觉不出,当图片大、列表长、快速滚动时会有区别

    2019-04-09
    2
  • Xcode
    谢谢老师的文章,受益匪浅,尽管好多RunLoop的代码没怎么看懂,但是会去啃的,眼前有个问题想请教下:关于现在跨平台混合开发,怎么看待?基本都不用原生代码了,我现在的团队都是用ionic+Cordova,每天都是用前端Angular写代码,我担心这样下去会废了,谢谢老师

    作者回复: 我觉跨平台的话优先选择使用 RN 或者 Flutter

    2019-04-24
    2
    1
  • 庞佳星
    老大,啥时候讲讲,resct native 和iOS的关系。谢谢啦,

    作者回复: 后面会专门说

    2019-04-10
    1
  • 茄菲
    "将那些繁重而不紧急会大量占用 CPU 的任务(比如图片加载)放到空闲的 RunLoop 模式里执行就可以避开在 UITrackingRunLoopMode这个 RunLoop 模式时是执行" 这样和将任务放置在异步线程里执行有什么区别呢?或者是这样有什么好处吗

    作者回复: 这样可以避免影响用户操作的流畅

    2019-08-15
    2
  • 您好,我请教一个问题,我看好像大多数监控卡顿都是UI主线程上,我想知道音视频播放以及直播的这种卡顿能否用这种方式监测到!通常直播这种流畅程度都是通过服务器端监控的,但是对于小公司来说,对接的直播基本都是第三方的库和服务平台,所以不太好太太去三方服务平台拉日志!所以如果我这种对接第三方直播库的app,如果我想把这种监控放到客户端来做,应该如何处理呢?谢谢,期待您解决我的疑问

    作者回复: 可以,监控是监控主线程,获取到卡顿时的信息是全部线程的方法调用堆栈信息,这样就能看到卡顿时其他线程的情况。也需要结合线程 CPU 使用率和一些用户所在场景的埋点进行综合判断。

    2019-05-21
  • 二木又土
    刚IM项目中遇到一个实际卡顿的情景,程序启动后,需要从服务端获取3w条会话列表,web收到数据后,需要排序后显示,排序操作需要700ms,加上列表显示大概要2秒的时间,想过排序放子线程操作,又要处理多线程的问题,很纠结。

    作者回复: 不用纠结,这种情况直接异步操作

    2019-04-25
  • Snow同學
    觉得使用:02 | App 启动速度怎么做优化与监控? 讲的内容,设置方法的执行最短时间,也是可以查找那些在主线程长时间执行的方法的

    作者回复: 这种方法不适合做线上监控

    2019-04-23
  • Ant
    今天没作业真是爽歪歪

    作者回复: 有啊,😁 我想请你回顾一下你都碰到过哪些卡顿问题,又是如何解决的呢?

    2019-04-09
收起评论
显示
设置
留言
56
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部