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:)];
时间: 2024-11-05 00:33:38

YYKit笔记之FPS的相关文章

流媒体学习笔记1:一个视频文件常用属性浅析之我见(bpp/vbr/resolution/fps)

因为工作原因,经常要接触视频相关的东西,而有一些视频常见的知识之前都是只知道个大概,甚至只是知道个名字的.很有必要对相关的知识整理下记录下来,以便有需要的人可以借鉴一二.但有些观点纯粹是天地会珠海分舵自己的理解,如果有误请指出,以免荼毒后人. 位深bpp 一般一个像素是由三原色RGB不同的颜色向量组成的,再加上个代表透明度的变量Alhpa值的话就是ARGB,当然,老一点的可能只有黑白,而没有RGB等.那么图片/视频文件中究竟由多少位来表示这些不同的颜色向量代表的就是位深,如只有黑白的话2位就足够

starling 笔记

starling 笔记 : 基于Stage3Dg开发出来的一个可以使用GPU加速2D应用程序的框架.是一个渲染框架! 特色:直观,轻量,免费. Starling与Sparrow框架很相近. 驱动关系:GPU-->OpenGL/ES2-DirectX-->stage3D-->starling 传统使用的Stage使用cup渲染,Starling使用GPU,减少CUP操作可以提升性能和体验. flash 显示层次结构 :stage video-->stage3D-->Displa

(zhuan) 一些RL的文献(及笔记)

一些RL的文献(及笔记) copy from: https://zhuanlan.zhihu.com/p/25770890  Introductions Introduction to reinforcement learningIndex of /rowan/files/rl ICML Tutorials:http://icml.cc/2016/tutorials/deep_rl_tutorial.pdf NIPS Tutorials:CS 294 Deep Reinforcement Lea

展讯sc7731 LCD驱动简明笔记之三

此篇笔记基于sc7731 - android 5.1,对lcd的gralloc库做一个简明笔记. 第一部分 调用gralloc.sc8830.so所谓的Gralloc模块,它就是一个模块,一个操作kernel层framebuffer驱动的动态库模块,它属于大名鼎鼎的HAL层.用的时候就加载到内存空间,不用的时候就从内存空间中卸载掉.下面看下系统如何将该模块加载到内存空间的.在Android系统中,所有访问HAL层模块的应用,都需要通过一个叫 hw_get_module() 的方法去获得需要的HA

《Pro Android Graphics》读书笔记之第二节

Android Digital Video: Formats, Concepts and Optimization Android Digital Video Formats: MPEG4 H.264 and WebM VP8 H.263 支持老显示器 MPEG4 SP   supported for commercial video(支持商业视频) 3GP Google在2.3.3中加入对WebM的支持 video Stream 4.0以后版本 recommend using MPEG-4 H

SWFTOOLS学习笔记一(转)

SWFTools提供了一系列将各种文件转成swf的工具: font2swf.exe gif2swf.exe jpeg2swf.exe pdf2swf.exe png2swf.exe wav2swf.exe 具体的功能就顾名思义了. 其中把pdf转成swf的工具就是pdf2swf了.在命令行中运行pdf2swf src.pdf des.swf一般能满足需求.而命令行参数可以通过pdf2swf -f得到: -h , –help                      Print short hel

cocos2d-x 3.0游戏实例学习笔记 《跑酷》一 开始界面

开始界面和前辈的基本上差不多:cocos2d-x游戏开发 跑酷(一)开始界面     但是也有不同 下面先给出游戏过程中用到的所有资源 开始界面定义为:MainScene 有如下功能: 1.背景 2.进入游戏界面按钮 3.预先加载背景音乐文件 .h文件 #ifndef __MainScene__H__ #define __MainScene__H__ #include "cocos2d.h" class MainScene : cocos2d::Layer{ public: virtu

FFMPEG解码学习笔记(一)

FFMPEG的基本处理流程 音频视频同步资料 av_frame_get_pkt_duration(frame) 获取当前帧的持续时间 av_frame_get_pkt_pos(frame) 从最后一个AVPacket进入解码重新排序的偏移量 av_frame_get_best_effort_timestamp(frame) 已流中的时间为基础预估的时间戳 /** * When decoding, this signals how much the picture must be delayed.

cocos2dx-3.2 笔记 - Animation

Animation 直接贴代码,具体里面一些加载SpriteFrame等操作,参考我的上一篇文章.这个是创建一个多帧动画在一个Sprite上显示. Sprite* buble = Sprite::createWithSpriteFrameName("buble.png"); Vector<SpriteFrame*>frames; for (int i=0;i<iAnimCount; i++) { char pngName[20]; sprintf(pngName, &