1、FPS 监测CADisplayLink
方法一:核心代码如下
@implementation ViewController {
UILabel *_fpsLbe;
CADisplayLink *_link;
NSTimeInterval _lastTime;
float _fps;
}
- (void)startMonitoring {
if (_link) {
[_link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[_link invalidate];
_link = nil;
}
_link = [CADisplayLink displayLinkWithTarget:self selector:@selector(fpsDisplayLinkAction:)];
[_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
}
- (void)fpsDisplayLinkAction:(CADisplayLink *)link {
if (_lastTime == 0) {
_lastTime = link.timestamp;
return;
}
self.count++;
NSTimeInterval delta = link.timestamp - _lastTime;
if (delta < 1) return;
_lastTime = link.timestamp;
_fps = _count / delta;
NSLog(@"count = %d, delta = %f,_lastTime = %f, _fps = %.0f",_count, delta, _lastTime, _fps);
self.count = 0;
_fpsLbe.text = [NSString stringWithFormat:@"FPS:%.0f",_fps];
}
监听count值的改变:
#pragma mark - observer
- (void)addObserver {
[self addObserver:self forKeyPath:@"count"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
NSLog(@"count new = %@, old = %@",
[change valueForKey:@"new"],
[change valueForKey:@"old"]);
}
方法二:核心代码如下(运行结果和方法一差不多。)
- (void)startFpsMonitoring {
_link = [CADisplayLink displayLinkWithTarget: self selector: @selector(displayFps:)];
[_link addToRunLoop: [NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes];
}
- (void)displayFps: (CADisplayLink *)fpsDisplay {
self.count++;
CFAbsoluteTime threshold = CFAbsoluteTimeGetCurrent() - _lastTime;
if (threshold >= 1.0) {
_fps = (_count / threshold);
_lastTime = CFAbsoluteTimeGetCurrent();
_fpsLbe.text = [NSString stringWithFormat:@"FPS:%.0f",_fps];
self.count = 0;
NSLog(@"count = %d,_lastTime = %f, _fps = %.0f",_count, _lastTime, _fps);
}
}