iOS 性能監(jiān)測(cè)之FPS

FPS.gif

示例Github:WSL_FPS

FPS :Frames Per Second 的簡(jiǎn)稱縮寫(xiě),意思是每秒傳輸幀數(shù),可以理解為我們常說(shuō)的“刷新率”(單位為Hz);FPS是測(cè)量用于保存、顯示動(dòng)態(tài)視頻的信息數(shù)量。每秒鐘幀數(shù)愈多,所顯示的畫(huà)面就會(huì)愈流暢,fps值越低就越卡頓,所以這個(gè)值在一定程度上可以衡量應(yīng)用在圖像繪制渲染處理時(shí)的性能。

CADisplayLink 是一個(gè)用于顯示的定時(shí)器, 它可以讓用戶程序的顯示與屏幕的硬件刷新保持同步,iOS系統(tǒng)中正常的屏幕刷新率為60Hz(60次每秒)。
CADisplayLink可以以屏幕刷新的頻率調(diào)用指定selector,也就是說(shuō)每次屏幕刷新的時(shí)候就調(diào)用selector,那么只要在selector方法里面統(tǒng)計(jì)每秒這個(gè)方法執(zhí)行的次數(shù),通過(guò)次數(shù)/時(shí)間就可以得出當(dāng)前屏幕的刷新率了。
CADisplayLink 簡(jiǎn)介:http://m.itdecent.cn/p/434ec6911148

初始化CADisplayLink,監(jiān)測(cè)FPS值的代碼如下:

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

//這個(gè)方法的執(zhí)行頻率跟當(dāng)前屏幕的刷新頻率是一樣的,屏幕每渲染刷新一次,就執(zhí)行一次,那么1秒的時(shí)長(zhǎng)執(zhí)行刷新的次數(shù)就是當(dāng)前的FPS值
- (void)displayLinkTick:(CADisplayLink *)link{
   
   //     duration 是只讀的, 表示屏幕刷新的間隔 = 1/fps
   //     timestamp 是只讀的, 表示上次屏幕渲染的時(shí)間點(diǎn)
   //    frameInterval 是表示定時(shí)器被觸發(fā)的間隔, 默認(rèn)值是1, 就是表示跟屏幕的刷新頻率一致。
   //    NSLog(@"timestamp= %f  duration= %f frameInterval= %f",link.timestamp, link.duration, frameInterval);
   
   //初始化屏幕渲染的時(shí)間
   if (_beginTime == 0) {
       _beginTime = link.timestamp;
       return;
   }
   //刷新次數(shù)累加
   _count++;
   //剛剛屏幕渲染的時(shí)間與最開(kāi)始幕渲染的時(shí)間差
   NSTimeInterval interval = link.timestamp - _beginTime;
   if (interval < 1) {
       //不足1秒,繼續(xù)統(tǒng)計(jì)刷新次數(shù)
       return;
   }
   //刷新頻率
   float fps = _count / interval;
   
   if (self.FPSBlock != nil) {
       self.FPSBlock(fps);
   }

   //1秒之后,初始化時(shí)間和次數(shù),重新開(kāi)始監(jiān)測(cè)
   _beginTime = link.timestamp;
   _count = 0;
}

FPS的值用懸浮視圖來(lái)展示,方便實(shí)時(shí)查看。懸浮圖的實(shí)現(xiàn)是利用了UIWindow的特性來(lái)實(shí)現(xiàn)的。
UIWindow簡(jiǎn)介: http://m.itdecent.cn/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];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容