zoukankan      html  css  js  c++  java
  • 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)
            
           }
  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/duzhaoquan/p/13696869.html
Copyright © 2011-2022 走看看