iOS端监控SDK探索与实践-屏幕FPS监控

高佳杰
1.为什么要监控FPS?
  • 屏幕的FPS的高低直接影响到UI界面的流畅性,可以检测界面的卡顿情况。
2.监控FPS的思路
  • CADisplayLink定时器的执行次数和屏幕每秒的帧数是一致的。只要记录CADisplayLink只要统计CADisplayLink的执行次数就能知道屏幕的帧数。
  • 使用NSProxy实现消息转发机制
3.核心代码
+ (instancetype)sharedInstance
{
    @synchronized(self){
        if (nil == FPSLabel){

            FPSLabel = [[DWDFPSLabel alloc] init];
            [[[UIApplication sharedApplication] keyWindow] addSubview:FPSLabel];
// 为什么不用self,self强引用,此时 timer持有 self,self 也持有 timer,循环引用导致页面 dismiss 时,双方都无法释放,造成循环引用
            FPSLabel.link = [CADisplayLink displayLinkWithTarget:[DWDWeakProxy proxyWithTarget:FPSLabel] selector:@selector(tick:)];
            [FPSLabel.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
        }
    }
    return FPSLabel;
}

- (void)dealloc {
    [_link invalidate];
}

- (void)tick:(CADisplayLink *)link {
    if (_lastTime == 0) {
        _lastTime = link.timestamp;
        return;
    }
    _count++;

    NSTimeInterval delta = link.timestamp - _lastTime;

    if (delta < 1) return;
    _lastTime = link.timestamp;
    float fps = _count / delta;
    _count = 0;
    CGFloat progress = fps / 60.0;
    NSString *text = [NSString stringWithFormat:@"%d FPS",(int)round(fps)];
    );
}
4.完整代码

DWDFPSExample