CADisplayLink 的使用

来源:互联网 发布:spring web flow 知乎 编辑:程序博客网 时间:2024/06/05 12:46

CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。

我们在应用中创建一个新的 CADisplayLink对象,把它添加到一个runloop中,并给它提供一个 targetselector在屏幕刷新的时候调用。

CADisplayLink和其它CoreAnimation类一样,都是在QuartzCore.framework里。

使用方式

-(void)setDisplayLink{

    displayLink = [CADisplayLinkdisplayLinkWithTarget:selfselector:@selector(waveAnimation)];

    [displayLinkaddToRunLoop:[NSRunLoopmainRunLoop]forMode:NSRunLoopCommonModes];

}

#pragma mark - animation

- (void)waveAnimation {

    //    do some  

    [selfsetNeedsDisplay];

}

- (void)stopDisplayLink

{

    [displayLinkinvalidate];

    displayLink =nil;

}


当把CADisplayLink对象addrunloop中后,selector就能被周期性调用,类似于NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimerinvalidate方法。


重要属性

下面不完整的列出了CADisplayLink的几个重要属性:

1frameInterval(iOS10之后取消了,用preferredFramesPerSecond代替。定义所需的每秒回调率帧。默认值是60。如果设置为0,将按本机显示硬件节奏。将选择最优回调所请求的速度)

可读可写的NSInteger型值,标识间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。官方文档中强调,当该值被设定小于1时,结果是不可预知的。

2duration

只读的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在targetselector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:时间=duration×frameInterval

现存的iOS设备屏幕的FPS都是60Hz,这一点可以从CADisplayLinkduration属性看出来。duration的值都是0.166666…,即1/60。尽管如此,我们并没法确定苹果不会改变FPS,如果以后某一天将FPS提升到了120Hz了怎么办呢?这时,你设置了frameInterval属性值为2期望每秒刷新30次,却发现每秒刷新了60次,结果可想而知,出于安全考虑,还是先根据duration判断屏幕的FPS再去使用CADisplayLink

3timestamp

只读的CFTimeInterval值,表示屏幕显示的上一帧的时间戳,这个属性通常被target用来计算下一帧中应该显示的内容。

打印timestamp值,其样式类似于:


  1. 179699.631584  

虽然名为时间戳,但这和常见的unix时间戳差异很大,事实上这是CoreAnimation使用的时间格式。每个CALayer都有一个本地时间(CALayer本地时间的具体作用会在后续文章中说明),可以获取当前CALayer的本地时间并打印:

  1. CFTimeInterval localLayerTime = [myLayer convertTime:CACurrentMediaTime() fromLayer:nil];  
  2. NSLog("localLayerTime:%f",localLayerTime);


参考文档:http://blog.csdn.net/wzzvictory/article/details/22417181

http://www.cnblogs.com/sixindev/p/4522825.html

http://www.jianshu.com/p/c35a81c3b9eb

原创粉丝点击