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;
}