ios线程卡顿

作者: 赵永洪 | 来源:发表于2017-04-09 17:06 被阅读44次

iOS设备虽然在硬件和软件层面一直在优化,但还是有不少坑会导致UI线程的卡顿。对于程序员来说,除了增加自身知识储备和养成良好的编程习惯之外,如果能一套机制能自动预报“卡顿”并检测出导致该“卡顿”的代码位置自然更好。本文就可能的实现方案做一些探讨和分析。先贴出最后方案的github地址

解决方案分析

简单来说,主线程为了达到接近60fps的绘制效率,不能在UI线程有单个超过(1/60s≈16ms)的计算任务。通过Instrument设置16ms的采样率可以检测出大部分这种费时的任务,但有以下缺点:

Instrument profile一次重新编译,时间较长。

只能针对特定的操作场景进行检测,要预先知道卡顿产生的场景。

每次猜测,更改,再猜测再以此循环,需要重新profile。

我们的目标方案是,检测能够自动发生,并不需要开发人员做任何预先配置或profile。运行时发现卡顿能即时通知开发人员导致卡顿的函数调用栈。

基于上述前提,我暂时能想到两个方案大致可行。

方案一:基于Runloop

主线程绝大部分计算或者绘制任务都是以Runloop为单位发生。单次Runloop如果时长超过16ms,就会导致UI体验的卡顿。那如何检测单次Runloop的耗时呢?

Runloop的生命周期及运行机制虽然不透明,但苹果提供了一些API去检测部分行为。我们可以通过如下代码监听Runloop每次进入的事件:

- (void)setupRunloopObserver{staticdispatch_once_tonceToken;dispatch_once(&onceToken, ^{CFRunLoopRefrunloop =CFRunLoopGetCurrent();CFRunLoopObserverRefenterObserver;        enterObserver =CFRunLoopObserverCreate(CFAllocatorGetDefault(),                                              kCFRunLoopEntry | kCFRunLoopExit,true,-0x7FFFFFFF,                                              BBRunloopObserverCallBack,NULL);CFRunLoopAddObserver(runloop, enterObserver, kCFRunLoopCommonModes);CFRelease(enterObserver);    });}staticvoidBBRunloopObserverCallBack(CFRunLoopObserverRefobserver,CFRunLoopActivityactivity,void*info) {switch(activity) {casekCFRunLoopEntry: {NSLog(@"enter runloop...");        }break;casekCFRunLoopExit: {NSLog(@"leave runloop...");        }break;default:break;    }}

相关文章

  • ios线程卡顿

    iOS设备虽然在硬件和软件层面一直在优化,但还是有不少坑会导致UI线程的卡顿。对于程序员来说,除了增加自身知识储备...

  • iOS通过runloop监控卡顿

    质量监控-卡顿检测iOS实时卡顿监控基于Runloop简单监测iOS卡顿的demo微信iOS卡顿监控系统iOS-R...

  • iOS卡顿监测方案总结

    iOS卡顿监测方案总结iOS卡顿监测方案总结

  • iOS app 卡顿导致的系统强杀

    卡顿里有一类卡顿又尤其严重:主线程长期不响应而导致的系统 Watchdog 强杀。 现在很多 iOS 线上 App...

  • # iOS线程保活(常驻线程)

    介绍 在日常的iOS开发中,遇到卡顿也是在所难免,一般卡顿是由于主线程处理耗时长的操作而造成线程一直在阻塞,那么我...

  • 卡顿监控

    卡顿 3.卡顿监控 卡顿:卡顿阀值设置为主线程执行消息队列中的消息时间超过200ms认为主线程卡顿频繁GC操作也会...

  • iOS 性能优化-读书笔记

    1.微信读书 iOS 性能优化总结 2.iOS实时卡顿监控 3.获取iOS任意线程调用堆栈(五)完整实现:BSBa...

  • ios卡顿监控

    一般认为卡顿主要指主线程卡顿。针对 UI 卡顿或者说主线程卡顿可以有多种监控方案: 1、利用 CADisplayL...

  • iOS开发UI卡顿&掉帧原因

    一、UI卡顿原因 二、 卡顿监控的实现一般有两种方案: (1)主线程卡顿监控。通过子线程监测主线程的 runLoo...

  • 卡顿检测资料

    微信iOS卡顿监控系统 卡顿方案思考 卡顿检测 移动端监控体系之技术原理 iOS性能检测

网友评论

    本文标题:ios线程卡顿

    本文链接:https://www.haomeiwen.com/subject/nlgdattx.html