美文网首页
iOS FPS 监测CADisplayLink 核心代码

iOS FPS 监测CADisplayLink 核心代码

作者: lukyy | 来源:发表于2021-03-10 10:05 被阅读0次

    1、FPS 监测CADisplayLink

    方法一:核心代码如下
    @implementation ViewController {
        UILabel *_fpsLbe;
        CADisplayLink *_link;
        NSTimeInterval _lastTime;
        float _fps;
    }
    
    - (void)startMonitoring {
        if (_link) {
            [_link removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
            [_link invalidate];
            _link = nil;
        }
        _link = [CADisplayLink displayLinkWithTarget:self selector:@selector(fpsDisplayLinkAction:)];
        [_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
    }
    
    - (void)fpsDisplayLinkAction:(CADisplayLink *)link {
        if (_lastTime == 0) {
            _lastTime = link.timestamp;
            return;
        }
        
        self.count++;
        NSTimeInterval delta = link.timestamp - _lastTime;
        if (delta < 1) return;
        _lastTime = link.timestamp;
        _fps = _count / delta;
        NSLog(@"count = %d, delta = %f,_lastTime = %f, _fps = %.0f",_count, delta, _lastTime, _fps);
        self.count = 0;
        _fpsLbe.text = [NSString stringWithFormat:@"FPS:%.0f",_fps];
    }
    

    监听count值的改变:

    #pragma mark - observer
    - (void)addObserver {
        [self addObserver:self forKeyPath:@"count" 
        options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
    }
    
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
            change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
        NSLog(@"count new = %@, old = %@",
        [change valueForKey:@"new"], 
        [change valueForKey:@"old"]);
    }
    
    方法二:核心代码如下(运行结果和方法一差不多。)
    - (void)startFpsMonitoring {
        _link = [CADisplayLink displayLinkWithTarget: self selector: @selector(displayFps:)];
        [_link addToRunLoop: [NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes];
    }
    
    - (void)displayFps: (CADisplayLink *)fpsDisplay {
        self.count++;
        CFAbsoluteTime threshold = CFAbsoluteTimeGetCurrent() - _lastTime;
        if (threshold >= 1.0) {
            _fps = (_count / threshold);
            _lastTime = CFAbsoluteTimeGetCurrent();
            _fpsLbe.text = [NSString stringWithFormat:@"FPS:%.0f",_fps];
            self.count = 0;
            NSLog(@"count = %d,_lastTime = %f, _fps = %.0f",_count, _lastTime, _fps);
        }
    }
    




    相关文章

      网友评论

          本文标题:iOS FPS 监测CADisplayLink 核心代码

          本文链接:https://www.haomeiwen.com/subject/iitwqltx.html