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