首页 > 代码库 > YYKit笔记之FPS

YYKit笔记之FPS

FPS计算方法

FPS是Frame per second的缩写,即每秒的帧数.这一术语广泛的应用于计算机图形学,视频采集,游戏等。

CADisplayLink

CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器,创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和selector 在屏幕刷新的时候调用。一旦CADisplayLink已特定的模式注册到runloop滞后,每当屏幕需要刷新的时候,runloop就会调用绑定的target上的selector,这时target可以读到CADisplayLink的每次调用的时间戳。

1     _link = [CADisplayLink displayLinkWithTarget:[YYWeakProxy proxyWithTarget:self] selector:@selector(tick:)];
2     [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
 1 - (void)tick:(CADisplayLink *)link {
 2     if (_lastTime == 0) {
 3         _lastTime = link.timestamp;
 4         return;
 5     }
 6     
 7     _count++;
 8     NSTimeInterval delta = link.timestamp - _lastTime;
 9     if (delta < 1) return;
10     _lastTime = link.timestamp;
11     float fps = _count / delta;
12     _count = 0;
13     
14     CGFloat progress = fps / 60.0;
15     UIColor *color = [UIColor colorWithHue:0.27 * (progress - 0.2) saturation:1 brightness:0.9 alpha:1];
16     
17     NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%d FPS",(int)round(fps)]];
18     [text setColor:color range:NSMakeRange(0, text.length - 3)];
19     [text setColor:[UIColor whiteColor] range:NSMakeRange(text.length - 3, 3)];
20     text.font = _font;
21     [text setFont:_subFont range:NSMakeRange(text.length - 4, 1)];
22     
23     self.attributedText = text;
24 }

代码参考:YYFPSLabel。

问题:

1。[YYWeakProxy proxyWithTarget:self]如何避免循环引用。

eg。

  [NSTimer timerWithTimeInterval:1.f target:self selector:@selector(tick:) userInfo:nil repeats:YES];
 CADisplayLink *_link = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)];

 以上两种用法,都会对self强引用,此时 timer持有 self,self 也持有 timer,循环引用导致页面 dismiss 时,双方都无法释放,造成循环引用。
此时使用 __weak 也不能有效解决:

__weak typeof(self) weakSelf = self;
_link = [CADisplayLink displayLinkWithTarget:weakSelf selector:@selector(tick:)];

YYKit笔记之FPS