Runloop - PFS监控

  • 通过实例化CADisplayLink添加到相当runloop中,并添加到当前应用程序窗口, 监控当前屏幕刷新率, 如果低于阈值, 可以高亮显示
  • 监控思路是获取当前屏幕刷新率,和1秒内的刷新次数, 如果刷新间隔 >=1秒 则计算其帧率比例, 如当前屏幕刷新次数 为55次, 时间间隔正好是1秒.则可以计算当前屏幕刷新率这1秒是55帧
  • FPS监控多用于开发测试环境中, 只管的用于快速发现问题
@interface ViewController ()
@property (nonatomic, strong) CADisplayLink *link;
@property (nonatomic, assign) NSInteger count;
@property (nonatomic, assign) NSTimeInterval lastTime;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _lastTime = 0;
    self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(fpsTest:)];
    [self.link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    
}

// 这个方法调用的频次和屏幕的刷新率一致,正常来说是每秒60次
- (void)fpsTest:(CADisplayLink *)sender
{
    if (_lastTime == 0) {
        _lastTime = sender.timestamp;
    }
    _count++;// 记录刷新次数
    double dif = sender.timestamp - _lastTime;// 记录每一帧的时间间隔
    if (dif >= 1) { // 当时间间隔超过1秒时候, 看下FPS还有多少帧, 正常来说(60帧,) count/1 = 多少FPS  50/1 = 50帧
        NSInteger FPS = _count/dif;
        _lastTime = sender.timestamp;
        _count = 0;
    }
    NSLog(@"FPS: %ld- %fd", _count, dif);
}
2022-12-30 17:00:00.240023+0800 FPSMonitor[7305:607921] FPS: 1- 0.000000d
2022-12-30 17:00:00.256695+0800 FPSMonitor[7305:607921] FPS: 2- 0.016667d
2022-12-30 17:00:00.273200+0800 FPSMonitor[7305:607921] FPS: 3- 0.033333d
2022-12-30 17:00:00.290061+0800 FPSMonitor[7305:607921] FPS: 4- 0.050000d
2022-12-30 17:00:00.306698+0800 FPSMonitor[7305:607921] FPS: 5- 0.066667d
2022-12-30 17:00:00.323369+0800 FPSMonitor[7305:607921] FPS: 6- 0.083333d
2022-12-30 17:00:00.340047+0800 FPSMonitor[7305:607921] FPS: 7- 0.100000d
2022-12-30 17:00:00.356710+0800 FPSMonitor[7305:607921] FPS: 8- 0.116667d
2022-12-30 17:00:00.373377+0800 FPSMonitor[7305:607921] FPS: 9- 0.133333d
--------------------------------------------------------------------------------------------n
2022-12-30 17:00:01.157236+0800 FPSMonitor[7305:607921] FPS: 56- 0.916667d
2022-12-30 17:00:01.173904+0800 FPSMonitor[7305:607921] FPS: 57- 0.933333d
2022-12-30 17:00:01.190076+0800 FPSMonitor[7305:607921] FPS: 58- 0.950000d
2022-12-30 17:00:01.206733+0800 FPSMonitor[7305:607921] FPS: 59- 0.966667d
2022-12-30 17:00:01.223425+0800 FPSMonitor[7305:607921] FPS: 60- 0.983333d
2022-12-30 17:00:01.240077+0800 FPSMonitor[7305:607921] FPS: 0- 1.000000d
2022-12-30 17:00:01.257274+0800 FPSMonitor[7305:607921] FPS: 1- 0.016667d
2022-12-30 17:00:01.273922+0800 FPSMonitor[7305:607921] FPS: 2- 0.033333d
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • iOS 中RunLoop 是一个事件循环对象 runloop跑一圈,只能执行一个事件。 一般一个线程执行任务完成后...
    小李不木阅读 655评论 0 0
  • iOS面试题目100道 1.线程和进程的区别。 进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,...
    有度YouDo阅读 30,137评论 8 137
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,264评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,675评论 1 32
  • APP开发中性能问题无疑是很重要的一点,有几项指标可以看出APP的性能是否存在问题,内存使用量,FPS,以及CPU...
    MichealXXX阅读 2,617评论 0 5

友情链接更多精彩内容