FPS 检测

iOS 的显示系统是由 VSync 信号驱动的,VSync 信号由硬件时钟生成,每秒钟发出 60 次(这个值取决设备硬件,比如 iPhone 真机上通常是 59.97)

什么是CADisplayLink

CADisplayLink是CoreAnimation提供的另一个类似于NSTimer的类,它总是在屏幕完成一次更新之前启动,它的接口设计的和NSTimer很类似,所以它实际上就是一个内置实现的替代,但是和timeInterval以秒为单位不同,CADisplayLink有一个整型的frameInterval属性,指定了间隔多少帧之后才执行。默认值是1,意味着每次屏幕更新之前都会执行一次。如果指定frameInterval为2,就是说动画每隔两帧执行一次, 依次类推.

CADisplayLink创建

CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)];
    [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

通俗地讲就是屏幕刷新一次执行一次selector, 那这样的话, 我们可以按60HZ(也就是1秒)为单位, 进行一个屏幕刷新次数的统计

- (void)tick:(CADisplayLink *)link {
    //执行次数
    _scheduleTimes++;
    
    //当前时间戳
    if(_timestamp == 0){
        _timestamp = link.timestamp;
    }
    CFTimeInterval timePassed = link.timestamp - _timestamp;
    
    // 等于1, 是为了和 60fps 作比较  1分钟60次 也就是60HZ
    if(timePassed >= 1.f) {
        //fps
        CGFloat fps = _scheduleTimes/timePassed;
        printf("fps:%.1f, timePassed:%f\n", fps, timePassed);
        //reset
        _timestamp = link.timestamp;
        _scheduleTimes = 0;
    }
}

全局变量声明

{
    CFTimeInterval _timestamp;
    NSInteger _scheduleTimes;
}

你可能感兴趣的:(FPS 检测)