- (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)selector;
displayLink依赖于runLoop监听哪一个线程的RunLoop
即添加到runloop,selector才能被执行
-
(void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
有添加就有移除 -
(void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode;
当把displayLink添加到mainRunLoop之后这个selector方法会在每次刷新屏幕之前执行
在selector方法内部记录下最后一次刷新的时间然后用当前的时间戳减去最后一次刷新的时间戳,然后用这个时间刷新的次数除以时间戳的差值,得到的值就是当前屏幕的刷新频率fps了,具体代码如下:
@interface viewController()
@property NSTimeInterval lastTimestamp;
@property CADisplayLink displayLink ;
@property int countPerFrame;
@end -
(void)viewDidLoad {
[super viewDidLoad];
///target selector 模式初始化一个实例
self.displayLink= [CADisplayLink displayLinkWithTarget:self selector:@selector(envokeDisplayLink:)];
///加入一个runLoop
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
} -
(void)envokeDisplayLink:(CADisplayLink *)displayLink {
if (_lastTimestamp == -1) {
_lastTimestamp = displayLink.timestamp;
return;
}
_countPerFrame ++;
NSTimeInterval interval = displayLink.timestamp - _lastTimestamp;
if (interval < 1) {
return;
}
_lastTimestamp = displayLink.timestamp;
CGFloat fps = _countPerFrame / interval;
}