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;//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。

同功能代码推荐: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;



 

转载于:https://www.cnblogs.com/H7N9/p/5992442.html

YYKit笔记之FPS相关推荐

  1. [Unity学习笔记:FPS游戏制作(3)]子弹拖尾,碰撞与枪口火焰效果

    往期博客[Unity学习笔记:FPS游戏制作(2)] 发射子弹----(2021.6.20学习笔记) 文章目录 一,实现思路 二,粒子效果的实现 (1)子弹拖尾特效的实现 (2)枪口火焰特效的实现 ( ...

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

    往期博客 [Unity学习笔记:FPS游戏制作(1)]角色的移动,旋转与推进上升----(2021.6.13学习笔记) 文章目录 一,实现思路 二,实现代码 三,脚本的使用方法 四,最终效果 一,实现 ...

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

    文章目录 一,什么是FPS游戏 二,功能实现思路与过程 (1)新建角色 (2)实现移动功能的思路 (3)实现旋转功能的思路 (4)实现推进上升功能的思路 (5)具体代码 (5)脚本的使用方法 (6)最 ...

  4. 【Unity笔记】FPS的认识与锁帧

    开发平台:Unity 2017版本以上 编程平台:Visual Studio 2017以上 一.认识FPS (帧数) FPS (Frames Per Second)是图像领域中的定义,是指画面每秒传输 ...

  5. Unity学习笔记:fps游戏玩家射击模块(2)

    功能:玩家发射子弹,弹夹有子弹发射 无子弹等待更换弹夹.枪可以单发 连发,播放音效 动画 火花. 主角子弹根据敌人部位减血,子弹击中目标销毁.敌人向玩家头部射击,射速较慢 易于躲藏. 需求分析: 枪 ...

  6. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  7. 【读书笔记】单人FPS关卡设计模式

    读了加利福尼亚大学的Kenneth Hullett, Jim Whitehead所写的"Design Patterns in FPS Levels"对其中的要点做下笔记,方便以后回 ...

  8. 《Face alignment at 3000 FPS via Regressing Local Binary Features》阅读笔记

    文章目录 一.前言 二.基于形状回归的人脸对齐算法 三.previous work 四.算法的具体实现 4.1 $\phi^{t}$ 的训练 4.2 全局线性回归矩阵 $W^{t}$ 的训练 五.局部 ...

  9. 多人网络游戏服务器开发基础学习笔记 II: 帧同步 | 游戏客户端预测原理分析 | FPS 游戏状态同步

    这篇是对书本 网络多人游戏架构与编程 的学习第二篇(第一篇:多人网络游戏服务器开发基础学习笔记 I:基本知识 | 游戏设计模式 | 网游服务器层次结构 | 游戏对象序列化 | 游戏 RPC 框架 | ...

  10. UE4-简单的FPS项目制作(B站视频笔记)P1P2

    UE4-简单的FPS项目制作 来源:B站视频:https://www.bilibili.com/video/BV1Dg4y1b7aA 看视频,记录操作流程,再自己制作一遍,再回顾 P1- 教程内容和方 ...

最新文章

  1. amazeui学习笔记--css(常用组件4)--关闭按钮Close
  2. CABasicAnimation 动画组合
  3. SpringBoot文件上传源码解析
  4. SAP WebIDE的本地安装方式
  5. java8 stream流操作集合交集,差集,并集,过滤,分组,去重,排序,聚合等
  6. centos 6.7 openssh 升级到openssh 7.1p
  7. nginx反向代理负载均衡简述
  8. 局域网文件共享服务器无法写入,局域网共享文件禁止复制、共享文件只读不能保存法...
  9. 学前儿童健康教育 复习资料 渝粤题库整理
  10. UVALive - 8270 A Partial Order Relation 哈斯图边数
  11. 走楼梯(斐波那契数列)
  12. 基于SVG的绘制多边形jQuery插件
  13. Unity DOTS 介绍
  14. matlab多径信道模型,多径时变信道模型的仿真与性能分析课程设计(样例3)
  15. 非全日制做JAVA,全日制与非全日制详解
  16. git bash里ln -s
  17. 优秀代码的必知必会(二)?
  18. java友盟自定义行为_实现友盟推送消息的完全自定义处理
  19. java jtextfield 密码_java中的文本输入框JTextField与JTextArea、密码输入框
  20. 浅谈幼儿园计算机论文,浅谈信息技术与幼儿教育的整合论文

热门文章

  1. c51汇编语言教程,汇编语言入门视频教程
  2. asp.net 旅游网站 源码+配置文档
  3. html日历修改,HTML精美日历插件
  4. compoundbutton(compoundbutton是什么意思)
  5. 如何判断一个网页是否更新
  6. gitlab 邮件服务器配置
  7. python 拟合线,拟合函数
  8. 学地质灾害还是学计算机专业,地质灾害与防治技术专科专业介绍
  9. matlab数字图像处理实验
  10. Android apk签名详解——AS签名、获取签名信息、系统签名、命令行签名