• 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)
            
           }
  • 相关阅读:
    上有传参下传json的接口调用
    通过群号,获取到群成员信息,下载头像到指定文件夹
    django模型 之 Meta
    k8s 日志的收集
    systemctl 管理服务
    安装JumpServer
    1 nginx的配置详解
    十六 RBAC
    python3 与linux间的小知识
    解决问题:OSError: mysql_config not found
  • 原文地址:https://www.cnblogs.com/duzhaoquan/p/13696869.html
Copyright © 2020-2023  润新知