YYKit笔记之FPS

时间:2022-09-16 10:10:05

FPS计算方法

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

CADisplayLink

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

     _link = [CADisplayLink displayLinkWithTarget:[YYWeakProxy proxyWithTarget:self] selector:@selector(tick:)];
[_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
 - (void)tick:(CADisplayLink *)link {
if (_lastTime == ) {
_lastTime = link.timestamp;//timestamp(表示屏幕显示的上一帧的时间戳)
return;
} _count++;
NSTimeInterval delta = link.timestamp - _lastTime;
if (delta < ) return;//不足一秒
_lastTime = link.timestamp;
float fps = _count / delta;
_count = ; CGFloat progress = fps / 60.0;
UIColor *color = [UIColor colorWithHue:0.27 * (progress - 0.2) saturation: brightness:0.9 alpha:]; NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%d FPS",(int)round(fps)]];
[text setColor:color range:NSMakeRange(, text.length - )];
[text setColor:[UIColor whiteColor] range:NSMakeRange(text.length - , )];
text.font = _font;
[text setFont:_subFont range:NSMakeRange(text.length - , )]; self.attributedText = text;
}

代码参考:YYFPSLabel。

同功能代码推荐:RRFPSBar

问题:

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:)];

避免循环引用的问题详细讲解见另一篇文章


//关键字typeof说明
 typeof的参数可以是两种形式:表达式或类型。

1,表达式的的例子:
        如果将typeof用于表达式,则该表达式不会执行。只会得到该表达式的类型。

 2,typeof构造中的类型名不能包含存储类说明符,如extern或static。不过允许包含类型限定符,如const或volatile。

    例如,下列代码是无效的,因为它在typeof构造中声明了extern:
        typeof(extern int) a;



 

YYKit笔记之FPS的更多相关文章

  1. 专项测试实战 &vert; 如何测试 App 流畅度(基于 FPS 和丢帧率)

    本文为霍格沃兹测试学院学员学习笔记. FPS 和丢帧率可以在一定程度上作为 APP 流畅度的一项衡量标准,本文介绍利用 adb shell dumpsys gfxinfo 命令获取软件渲染加载过程的数 ...

  2. Learning to Track at 100 FPS with Deep Regression Networks ECCV 2016 论文笔记

    Learning to Track at 100 FPS with Deep Regression Networks   ECCV 2016  论文笔记 工程网页:http://davheld.git ...

  3. Minimum Barrier Salient Object Detection at 80 FPS 论文阅读笔记

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  4. UE4 多人FPS VR游戏制作笔记

    1, 2,服务器游戏流程 服务器负责驱动游戏流程.服务器的职责是在游戏开始/结束以及 actor 复制更新等情况下通知客户端转移到新地图. 主要架构部分 大多在本文的讨论范围之外,但我们可以在遇到特定 ...

  5. Direct3D学习笔记 - 浅析HDR Lighting Sample

    一.HDR简介 HDR(High Dynamic Range,高动态范围)是一种图像后处理技术,是一种表达超过了显示器所能表现的亮度范围的图像映射技术.高动态范围技术能够很好地再现现实生活中丰富的亮度 ...

  6. 视频文件写入转换之图像处理-OpenCV应用学习笔记五

    在<笔记二>中我们做了视频播放和控制的实现,仅仅算是完成了对视频文件的读取操作:今天我们来一起练习下对视频文件的写入操作:格式转换. 实现功能: 打开一个视频文件play.avi,读取文件 ...

  7. android cocos2d-x for Android安装和学习笔记(请用adt-bundle21&period;1或以上导入)

    引用:http://weimingtom.iteye.com/blog/1483566 (20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁 ...

  8. &lbrack;Cocos2d-x for WP8学习笔记&rsqb; HelloWorld结构分析

    先来看一下目录结构: Assets:游戏资源文件,图片音频等,Resource文件夹也有类似功能 include:用于放置游戏头文件 Shaders:渲染器着色器文件(大雾) cocos2dorig. ...

  9. linux内核编程笔记【原创】

    以下为本人学习笔记,如有转载请注明出处,谢谢 DEFINE_MUTEX(buzzer_mutex); mutex_lock(&buzzer_mutex); mutex_unlock(& ...

随机推荐

  1. ubuntu 常见错误--Could not get lock &sol;var&sol;lib&sol;dpkg&sol;lock

    ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx时出错:E: Could not ...

  2. Device eth0 does not seem to be present&comma; delaying initialization&period; 问题

    今天在复制vmware的时候 出现网卡无法启动 报错显示 Device eth0 does not seem to be present, delaying initialization. 这个错误原 ...

  3. 关于android4&period;3 Intel X86 Atom System Image的下载

    今天建立android4.3模拟器的时候发现没有android4.3 Intel X86 Atom System Image可选,打开android SDK Manager 于是希望重现选择下载安装, ...

  4. C&num;中位、字节等知识

    本文介绍C#中位.字节等知识. 1. 位(bit) 位(bit)有叫做比特,指二进制中的一位,是二进制的最小信息单位. bit也被称作小b,用b表示. 2. 字节(bytes) 8位表示一个字节. 由 ...

  5. 从UnitedStack OS 1&period;0 Preview试用申请问卷调查学习OpenStack

    http://www.diaochapai.com/survey/ 您的角色最可能是? * (必填, 多选) OpenStack私有云用户,希望能将OpenStack/UOS用于公司内部私有云 云计算 ...

  6. 转载:Hadoop权威指南学习笔记

    转自:http://pieux.github.io/blog/2013-05-08-learn-hadoop-the-definitive-guide.html 1 前言 Hadoop的内部工作机制: ...

  7. &period;Echo 命令中经常提到回显&comma;是什么意思&quest;

    C:\>echo on C:\>date /t2006-08-06 星期日 C:\>以上内容是在打开回显的情况下执行的,其实我们想看到的只有2006-08-06 星期日这一行内容,但 ...

  8. JAVA 编程思想第一章习题

    //: ch1.01/IntChar.java package object; import java.util.*; public class IntChar { int x; char y; pu ...

  9. 报数的golang实现

    报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: . . . . . 1 被读作 "one 1" ("一个一") , 即 11 ...

  10. 分布式系统缓存系列之guava cache

      guava是google的一个开源java框架,其github地址是 https://github.com/google/guava.guava工程包含了若干被Google的 Java项目广泛依赖 ...