YYKit笔记之FPS

Posted 形而上者谓之道,形而下者谓之器。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

YYKit源码探究(五十六) —— NSData分类之Hash(一)

[Unity学习笔记:FPS游戏制作] 发射子弹————(2021.6.20学习笔记)

[Unity学习笔记:FPS游戏制作]角色的移动,旋转与推进上升————(2021.6.13学习笔记)

DOM探索之基础详解——学习笔记

Elasticsearch笔记九之优化

YYKit源码学习——YYMemoryCache