在开发中,实时的显示当前的fps能够使我们更加直接的了解app当前的性能及运行状况,代码如下:

FPSLabel.swift

import UIKit

class FPSLabel: UILabel {

fileprivate var displayLink: CADisplayLink?

fileprivate var lastTime: TimeInterval = 0

fileprivate var count: Int = 0

deinit {

displayLink?.invalidate()

}

override func didMoveToSuperview() {

frame = CGRect(x: 15, y: 150, width: 40, height: 40)

layer.cornerRadius = 20

clipsToBounds = true

backgroundColor = UIColor.black

textColor = UIColor.green

textAlignment = .center

font = UIFont.systemFont(ofSize: 24)

run()

}

func run() {

displayLink = CADisplayLink(target: self, selector: #selector(FPSLabel.tick(_:)))

displayLink?.add(to: .current, forMode: .commonModes)

}

@objc func tick(_ displayLink: CADisplayLink) {

if lastTime == 0 {

lastTime = displayLink.timestamp

return

}

count += 1

let timeDelta = displayLink.timestamp - lastTime

if timeDelta < 0.25 {

return

}

lastTime = displayLink.timestamp

let fps: Double = Double(count) / timeDelta

count = 0

text = String(format: "%.0f", fps)

textColor = fps > 50 ? UIColor.green : UIColor.red

}

}

然后在我们的BaseViewController添加如下代码

class BaseViewController: UIViewController {

#if DEBUG

private lazy var newFpsLabel: FPSLabel = {

let label = FPSLabel()

return label

}()

#endif

override func viewDidLoad() {

super.viewDidLoad()

#if DEBUG

view.addSubview(newFpsLabel)

#endif

}

}

OC版代码如下

#import "TJBLFpsLabel.h"

@interface TJBLFpsLabel ()

@property (nonatomic, strong) CADisplayLink *displayLink;

@property (nonatomic, assign) NSTimeInterval lastTime;

@property (nonatomic, assign) int count;

@end

@implementation TJBLFpsLabel

- (void)didMoveToSuperview {

self.frame = CGRectMake(15, 150, 80, 40);

self.layer.cornerRadius = 20;

self.layer.masksToBounds = YES;

self.backgroundColor = [UIColor blackColor];

self.textColor = [UIColor greenColor];

self.textAlignment = NSTextAlignmentCenter;

self.font = [UIFont systemFontOfSize:24];

[self run];

}

- (void)run {

_displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)];

[_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

}

- (void)tick:(CADisplayLink *)sender {

if (_lastTime == 0) {

_lastTime = _displayLink.timestamp;

return;

}

_count += 1;

NSTimeInterval timeDelta = _displayLink.timestamp - _lastTime;

if (timeDelta < 0.25) {

return;

}

_lastTime = _displayLink.timestamp;

double fps = (double)_count / timeDelta;

_count = 0;

self.text = [NSString stringWithFormat:@"%.1f",fps];

self.textColor = fps > 50 ? UIColor.greenColor : UIColor.redColor;

}

@end

添加

#ifdef DEBUG

UIWindow *window = [UIApplication sharedApplication].keyWindow;

TJBLFpsLabel *fpsLabel = [[TJBLFpsLabel alloc] init];

[window addSubview:fpsLabel];

[window bringSubviewToFront:fpsLabel];

#endif

trick函数原理

CADisplayLink 的调用频率始终和屏幕刷新的刷新的频率一致

fps = 刷新次数 / 间隔时间

ios查看帧率的软件_iOS开发-自己写一个实时显示fps帧数的小控件相关推荐

  1. ios查看帧率的软件_iOS实时流畅性监控

    移动APP开发,性能一直是我们关心的重要话题,Xcode提供了一些方便的工具检测性能问题,但是这些工具使用并不方便,一般只有在发现性能问题的时候我们才会使用这些工具.快速的发现性能问题,有助于我们主动 ...

  2. ios查看帧率的软件_程序员必看!直播软件开发弱网下保障高清流畅推流的方法...

    通常情况下程序员在开发直播软件时,优化卡顿和延迟是比较多的,只要是优化欠佳,就会导致前端APP运行出问题,为了帮助程序员在开发过程中能更加合理有效的优化,小编在这里从开发的层面简要介绍一下影响直播体验 ...

  3. 为什么软件项目开发要写规格书

    为什么软件项目开发要写规格书 开发软件项目为什么要写规格书 为什么人们不写? 没有规格书的项目什么样子 ? 有规格书的项目是什么样子? 开发软件项目为什么要写规格书 以上内容,纯是个人的观点,全局默认 ...

  4. mac下dashboard小控件开发实例(附源码)

    1.背景          用mac的用户都应该知道,mac有一个很好的功能,就是dashboard小控件的功能,按下F12键就可以自由切换.博主最近在背GRE单词,就尝试这开发了一个背单词的dash ...

  5. 如何在完全不懂服务器开发的情况下做一个实时联网对战的微信小游戏

    微信小游戏即将开放?有我们在,你还赶得上! 根据微信官方对外公开的消息,微信小游戏的脚步越来越接近了.它的开发者资格门槛和使用者门槛都很低,以后必将引爆一波"全民开发小游戏"浪潮. ...

  6. 开发数字时钟桌面小控件

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 所谓桌面小控件,就是指能直接显示在Android系统桌面的小程序,比如模拟时钟等.桌面小控件是通过Broadc ...

  7. Kotlin 开发Android app(十二):Android布局FrameLayout和ViewPager2控件实现滚动广告栏

    在上一节中我们简单的介绍了RecyclerView 的使用,他是整个开发的重点控件,这一节我们来看看FrameLayout 布局结合ViewPager2,开发一个广告控件. 新模块banner 先创建 ...

  8. android桌面时钟小控件开发记录

    所谓桌面小控件,就是能之间显示在Android系统桌面的小程序. 桌面小控件的实现是基于Broadcast的形式实现的,因此,每一个桌面小控件都对应于一个BroadcastReceiver类.Andr ...

  9. 基于DirectShow视频及图片捕获软件的开发(写的非常详细)在后几篇博客 我会更新

    我们知道目前很多工业相机的图像数据采集都是基于DirectShow的,常见的有映美精等.DirectShow是微软公司提供的一套在Windows平台上进行流媒体处理的开发包,与DirectX开发包一起 ...

  10. 软件项目开发应写的13类文档

    在软件项目开发过程中,应该按软件开发要求撰写十三类文档,文档编制要求具有针对性.精确性.清晰性.完整性.灵活性.可追溯性! 需求阶段             1.可行性分析报告         说明该 ...

最新文章

  1. 电子书下载:Moving to Microsoft Visual Studio 2010
  2. [codevs3044][POJ1151]矩形面积求并
  3. python优先队列_python 多线程优先队列Queue详解
  4. 儿童手表怎么删除联系人_儿童节来了,送孩子400多元的超值礼物,儿童手表9X评测分享...
  5. go waitgroup.done()异常处理_Go 异常处理
  6. Android 创建新Project时报错 Cannot create linked resource
  7. java 反射 int_Java 反射由浅入深 | 进阶必备
  8. Spring项目的按层打包已过时
  9. 吴恩达机器学习作业Python实现(五):偏差和方差
  10. QApplication、QGuiApplication和QCoreApplication三者的区别与联系
  11. mysql8 json_table_新特性解读 | MySQL 8.0 json到表的转换
  12. 修改保存hosts文件
  13. 过滤器 和 拦截器的 6个区别,别再傻傻分不清了
  14. Android Studio开发记录
  15. OpenSSL密码库算法笔记——第2.3.3章 Montgomery模数与相关函数
  16. 如何用计算机计算幅度,用自然语言的方式做计算:Numi 计算器
  17. 用大数据解决“痛点”问题 “云上贵州”再发力
  18. Openvpn 客户端路由配置
  19. 前端解决web端 125%,150%缩放,1366*768分辨率兼容问题
  20. 从头开始,彻底理解服务端渲染原理

热门文章

  1. windows自带黑体_win10黑体,windows10里的黑体
  2. 在OpenFOAM中获取网格详细信息
  3. 三面头条,靠P9级算法分享的两本算法pdf书籍,轻松拿到offer
  4. VS解决方案目录和工程目录
  5. 生信学习笔记:生物信息学测序分析基本流程入门笔记
  6. testbench实例 vhdl_testbench实例
  7. linux锐捷代码_Linux平台锐捷认证客户端联网方法
  8. Linux VNC使用
  9. 如何快速实现自定义sql分页?若不会,我便手把手教你【详细】
  10. 虚拟机下载-下载windows镜像