一个简单的FPS监控器

最近在看有关iOS性能监控方面的知识,了解到如何通过CADisplayLink来实现一个简单的屏幕刷新帧率监控的方法,在Blog里面做一个Mark。

首先我们要了解一下CADisplayLink是个什么玩意儿,官方给出的解释是这样的:

1
A timer object that allows your application to synchronize its drawing to the refresh rate of the display.

说白了,就是以屏幕刷新频率将内容绘制到屏幕上的定时器。它可以以屏幕的刷新频率调用指定的selector,而iOS系统中正常的屏幕刷新频率为60Hz(每秒60次),那我们只要在这个方法里面统计每秒这个方法执行的次数,通过调用次数除以时间间隔(_count/interval)就可以得出当前屏幕的刷新频率了。

接下来贴出核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 开始监控FPS的方法
- (void)start {
if (_displayLink) {
_displayLink.paused = NO;
}else {
_displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(triggerFps:)];
// 让当前runloop在 UITrackingRunloopMode 下可以接收到回调
[_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
}
}

// 刷新频率回调方法
- (void)triggerFps:(CADisplayLink *)displayLink {
// 大约每1/60秒调用一次 就是说每16.7ms 要产生一帧画面。
// 记录第一次调用时的时间戳
if (_lastTimestamp == 0) {
_lastTimestamp = displayLink.timestamp;
return;
}
_count++;
// 当count=60 时 interval >= 1 才会执行后面的fps值计算
NSTimeInterval interval = displayLink.timestamp - _lastTimestamp;
if (interval < 1) {
return;
}
// 计算出fps
CGFloat fps = _count / interval;

// 记录上一次的时间戳
_lastTimestamp = displayLink.timestamp;
// reset _count
_count = 0;

// 调整fps值
NSInteger intFps = (NSInteger)(fps + 0.5);
self.currentFps = intFps;
if (self.FPSBlock) {
self.FPSBlock(self.currentFps);
}
}

通过上面的代码就能统计到帧数的变化了,这个FPS指示器也就完成了。

谢谢您的支持!