CADisplayLink类
CADisplayLink是一个可以让UI的绘图渲染和显示器的刷新帧率保持一致的计时器对象。
1、概述
创建一个新的展示链,需要提供一个目标对象和方法,在屏幕刷新的时候调用该方法。然后需要在应用中将此展示链添加进应用的运行循环中。
一旦显示链添加进了应用的运行循环中,那么在屏幕内容需要刷新时目标对象的方法就会被调用。目标对象可以通过读取展示链的timestamp属性获取到前一帧展示的时间点。例如,在播放视频的应用中,或许会用timestamp计算下一帧展示的时间。一个展示自身动画的应用或许会用timestamp来决定展示对象在下一帧中在哪里展示和以什么方式展示。duration属性提供了两帧之间的时间间隔。可以用该属性计算显示器帧率,以及显示器下一帧的大概时间。还可以调整绘制行为以便在显示之前下一帧已经做好准备。
在使用中,可以通过设置属性paused的值为YES来停止目标对象方法的执行。如果应用在给定的时间里无法及时提供帧率,那么可以选择让显示帧率满一点。更慢但连续的帧率会比直接跳过的帧率显得更柔和。可以通过设置属性frameInterval(默认值是1即每每一帧都调用一次)来达到更快更慢的效果。(此属性现在使用preferredFramesPerSecond替换)
当不再需要展示链时调用invalidate来将其中运行循环中移除并和目标对象分离开。另外,CADisplayLink不能被继承。
2、使用
a 创建实例:
1、概述
创建一个新的展示链,需要提供一个目标对象和方法,在屏幕刷新的时候调用该方法。然后需要在应用中将此展示链添加进应用的运行循环中。
一旦显示链添加进了应用的运行循环中,那么在屏幕内容需要刷新时目标对象的方法就会被调用。目标对象可以通过读取展示链的timestamp属性获取到前一帧展示的时间点。例如,在播放视频的应用中,或许会用timestamp计算下一帧展示的时间。一个展示自身动画的应用或许会用timestamp来决定展示对象在下一帧中在哪里展示和以什么方式展示。duration属性提供了两帧之间的时间间隔。可以用该属性计算显示器帧率,以及显示器下一帧的大概时间。还可以调整绘制行为以便在显示之前下一帧已经做好准备。
在使用中,可以通过设置属性paused的值为YES来停止目标对象方法的执行。如果应用在给定的时间里无法及时提供帧率,那么可以选择让显示帧率满一点。更慢但连续的帧率会比直接跳过的帧率显得更柔和。可以通过设置属性frameInterval(默认值是1即每每一帧都调用一次)来达到更快更慢的效果。(此属性现在使用preferredFramesPerSecond替换)
当不再需要展示链时调用invalidate来将其中运行循环中移除并和目标对象分离开。另外,CADisplayLink不能被继承。
2、使用
a 创建实例:
<span style="font-size:14px;">+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;</span>
b 执行
<span style="font-size:14px;">- addToRunLoop:forMode: 注册展示链到运行循环中
- removeFromRunLoop:forMode: 将展示链从指定运行循环中移除
- invalidate 将展示链移出所有运行模式</span>
c 设置
duration 屏幕刷新间隔时间
paused 是否暂停向目标对象调用的方法
timestamp 图像上一帧显示的时间
preferredFramesPerSecond 每一秒显示多少帧
targetTimestamp 目标对象方法被调用的下一次时间点
注:iOS设备的刷新频率事60HZ也就是每秒60次。那么每一次刷新的时间就是1/60秒 大概16.7毫秒。当我们的frameInterval值为1的时候我们需要保证的是 CADisplayLink调用的target的函数计算时间不应该大于 16.7否则就会出现严重的丢帧现象。