iOS 的顯示系統(tǒng)是由 VSync 信號驅動的鲸拥,VSync 信號由硬件時鐘生成梦重,每秒鐘發(fā)出 60 次(這個值取決設備硬件润歉,比如 iPhone 真機上通常是 59.97)
什么是CADisplayLink
CADisplayLink是CoreAnimation提供的另一個類似于NSTimer的類璧眠,它總是在屏幕完成一次更新之前啟動足陨,它的接口設計的和NSTimer很類似嫂粟,所以它實際上就是一個內置實現的替代,但是和timeInterval以秒為單位不同墨缘,CADisplayLink有一個整型的frameInterval屬性星虹,指定了間隔多少幀之后才執(zhí)行零抬。默認值是1,意味著每次屏幕更新之前都會執(zhí)行一次宽涌。如果指定frameInterval為2平夜,就是說動畫每隔兩幀執(zhí)行一次, 依次類推.
CADisplayLink創(chuàng)建
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(tick:)];
[link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
通俗地講就是屏幕刷新一次執(zhí)行一次selector, 那這樣的話, 我們可以按60HZ(也就是1秒)為單位, 進行一個屏幕刷新次數的統(tǒng)計
- (void)tick:(CADisplayLink *)link {
//執(zhí)行次數
_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;
}