iOS 性能监测之FPS

FPS.gif

示例Github:WSL_FPS

FPS :Frames Per Second 的简称缩写,意思是每秒传输帧数,可以理解为我们常说的“刷新率”(单位为Hz);FPS是测量用于保存、显示动态视频的信息数量。每秒钟帧数愈多,所显示的画面就会愈流畅,fps值越低就越卡顿,所以这个值在一定程度上可以衡量应用在图像绘制渲染处理时的性能。

CADisplayLink 是一个用于显示的定时器, 它可以让用户程序的显示与屏幕的硬件刷新保持同步,iOS系统中正常的屏幕刷新率为60Hz(60次每秒)。 CADisplayLink可以以屏幕刷新的频率调用指定selector,也就是说每次屏幕刷新的时候就调用selector,那么只要在selector方法里面统计每秒这个方法执行的次数,通过次数/时间就可以得出当前屏幕的刷新率了。 CADisplayLink 简介:https://www.jianshu.com/p/434ec6911148

初始化CADisplayLink,监测FPS值的代码如下:

_displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkTick:)];
       [_displayLink setPaused:YES];
       [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

//这个方法的执行频率跟当前屏幕的刷新频率是一样的,屏幕每渲染刷新一次,就执行一次,那么1秒的时长执行刷新的次数就是当前的FPS值
- (void)displayLinkTick:(CADisplayLink *)link{
   
   //     duration 是只读的, 表示屏幕刷新的间隔 = 1/fps
   //     timestamp 是只读的, 表示上次屏幕渲染的时间点
   //    frameInterval 是表示定时器被触发的间隔, 默认值是1, 就是表示跟屏幕的刷新频率一致。
   //    NSLog(@"timestamp= %f  duration= %f frameInterval= %f",link.timestamp, link.duration, frameInterval);
   
   //初始化屏幕渲染的时间
   if (_beginTime == 0) {
       _beginTime = link.timestamp;
       return;
   }
   //刷新次数累加
   _count++;
   //刚刚屏幕渲染的时间与最开始幕渲染的时间差
   NSTimeInterval interval = link.timestamp - _beginTime;
   if (interval < 1) {
       //不足1秒,继续统计刷新次数
       return;
   }
   //刷新频率
   float fps = _count / interval;
   
   if (self.FPSBlock != nil) {
       self.FPSBlock(fps);
   }

   //1秒之后,初始化时间和次数,重新开始监测
   _beginTime = link.timestamp;
   _count = 0;
}

FPS的值用悬浮视图来展示,方便实时查看。悬浮图的实现是利用了UIWindow的特性来实现的。 UIWindow简介: https://www.jianshu.com/p/cda083e44abd

 _fpsLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
        _fpsLabel.textAlignment = NSTextAlignmentCenter;
        _fpsLabel.backgroundColor = [UIColor orangeColor];
        _fpsLabel.font = [UIFont systemFontOfSize:15];
        _fpsLabel.alpha = 0.7;
        
        UIViewController * viewc = [[UIViewController alloc] init];
        _window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
        _window.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2.0, 64);
        _window.windowLevel = UIWindowLevelAlert + 1;
        _window.layer.cornerRadius = 10;
        _window.clipsToBounds = YES;
        _window.rootViewController = viewc;
        [_window addSubview:_fpsLabel];
        [_window makeKeyAndVisible];
        
        UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
        _window.userInteractionEnabled = YES;
        [_window addGestureRecognizer:pan];

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS开发攻城狮的集散地

iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果

38970
来自专栏老司机的简书

CoreText实现图文混排之文字环绕及点击算法

1.老司机最开始没有留demo,以至于这个博客老司机从发出来到现在整整维护了半年了=。=其实博客里面就是全部代码,但是宝宝们任性的要demo。

21520
来自专栏Coding迪斯尼

对Box2D的物理世界进行图像美化和关卡选择设计

我们用Box2D绘制了很多几何图形,例如圆形,矩形,复杂一点就是两个矩形交叉的合在一起,中间再加个圆形。显然这种界面“太素”了,一个丰富多彩,五彩斑斓的游戏世界...

10210
来自专栏iOS开发攻城狮的集散地

iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果

好了,就说这么多了,demo中注释的还算是清楚的,感兴趣的可以去look look??!

468140
来自专栏Android群英传

onTouchEvent(一) 你所必须知道的坐标详解

10740
来自专栏進无尽的文章

UI篇-Layer几个关键点补充

强大的UIView是基于 CALayer实现的,它的重要性不言而喻,相信大家也都有自己的研究和理解,今天这片文章里的内容是几个关键点的补充。

13210
来自专栏非著名程序员

Android中图片大小和屏幕密度的关系讲解

Android手机适配是非常让人头疼的一件事,尤其是图片,android为了做到是适配提供了很多文件夹来存放不同大小的图片,比如:drawable-ldpi、d...

21660
来自专栏Web行业观察

简单了解下无障碍设计模式

一款设计良好的产品可供所有能力的用户使用,包括视力低下、失明、听力障碍、认知障碍或运动障碍的用户。改进产品的无障碍功能可以增强所有用户的可用性,这是非常值得做的...

37840
来自专栏24K纯开源

用Qt写软件系列五:一个安全防护软件的制作(1)

引言       又有许久没有更新了。Qt,我心爱的Qt,为了找工作不得不抛弃一段时间,业余时间来学一学了。本来计划要写一系列关于Qt组件美化的博文,但是写了几...

24670
来自专栏老司机的简书

老司机带你走进Core Animation 之几种动画的简单应用

之所以要写这几种简单应用呢,是为了帮大家扩展一下思维,基于CAAnimation和CADisplayLink其实我们可以做到很多事情,不过我们都还是需要一个思路...

13120

扫码关注云+社区

领取腾讯云代金券