iOS卡顿检测

卡顿问题,就是在主线程上无法响应用户交互的问题。如果一个App时不时地就给你卡

         一下,有时还长时间无响应,这时你还愿意继续用它吗?所以说,卡顿问题对App的伤

         害是巨大的,也是我们必须要重点解决的一个问题。

         现在,我们先来看一下导致卡顿问题的几种原因:

         ●复杂UI、图文混排的绘制量过大;

         ●在主线程.上做网络同步请求;

         ●在主线程做大量的I0操作;

         ●运算量过大,CPU持续高占用;

         ●死锁和主子线程抢锁。

         那么,我们如何监控到什么时候会出现卡顿呢?是要监视FPS吗?

         FPS是一秒显示的帧数,也就是-秒内画面变化数量。如果按照动画片来说,动画片的

         FPS就是24,是达不到60满帧的。也就是说,对于动画片来说,24帧时虽然没有60

         帧时流畅,但也已经是连贯的了,所以并不能说24帧时就算是卡住了。

         由此可见,简单地通过监视FPS是很难确定是否会出现卡顿问题了,所以我就果断弃了

         诵过监视FPS来监控卡顿的方案

RunLoop原理

对于iOS开发来说,监控卡顿就是要去找到主线程上都做了哪些事儿。我们都知道,线程的消息事件是依赖于NSRunL oop的,所以从NSRunLoop入手,就可以知道主线程上都调用了哪些方法。我们通过监听NSRunL oop的状态,就能够发现调用方法是否执行时间过长,从而判断出是否会出现卡顿。所以,我推荐的监控卡顿的方案是:通过监控RunLoop的状态来判断是否会出现卡顿。RunLoop是iOs开发中的一个基础概念,为了帮助你理解并用好这个对象,接下来我会先和你介绍一下它可以做哪些事儿,以及它为什么可以做成这些事儿。RunLoop这个对象,在ios里由CFRunLoop实现。简单来说,RunL oop是用来监听输入源,进行调度处理的。这里的输入源可以是输入设备、网络、周期性或者延迟时间、异步回调。RunL oop会接收两种类型的输入源: -种是来自另一个线程或者来自不同应用的异步消息;另一种是来自预订时间或者重复间隔的同步事件。RunLoop的目的是,当有事件要去处理时保持线程忙,当没有事件要处理时让线程进入休眠。所以,了解RunL oop原理不光能够运用到监控卡顿.上,还可以提高用户的交互体验。通过将那些繁重而不紧急会大量占用CPU的任务(比如图片加载), 放到空闲的RunLoop模式里执行,就可以避开在UITrackingRunL oopMode这个RunL _oop模式时是执行。UITrackingRunL oopMode是用户进行滚动操作时会切换到的RunL oop模式,避免在这个RunL _oop模式执行繁重的CPU任务,就能避免影响用户交互操作上体验。

class func checkfps(){
        var runLoopActivity:CFRunLoopActivity = .allActivities
        let runLoopObserver = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, CFRunLoopActivity.allActivities.rawValue, true, CFIndex.init(bitPattern: 2000000 - 1)) { (Observer, Activity) in
            runLoopActivity = Activity
            var timeoutCount = Date().timeIntervalSince1970
            if (runLoopActivity == .beforeWaiting) {
                timeoutCount = Date().timeIntervalSince1970
            }
            if (runLoopActivity == .afterWaiting) {
                let new = Date().timeIntervalSince1970
                //100毫秒
                if new - timeoutCount > 0.01{
                    let symb = Thread.callStackSymbols
                    print("---------3s-----------\(symb)")
                }
            }
        }
        
        CFRunLoopAddObserver(CFRunLoopGetCurrent(), runLoopObserver, CFRunLoopMode.commonModes)
        
       }

 

iOS卡顿检测

上一篇:Metasploit攻击win7实例


下一篇:VMware Workstation安装安卓Android-X86 最新版