首先说一下屏幕刷新原理和卡顿产生的原因,方便对CADisplayLink的理解。
屏幕刷新原理:CRT的电子枪按照上图中的方式,从上到下一行行扫描扫描完成后显示器就呈现一帧画面,随后电子枪回到初始位置继续下一次的扫描。
水平同步信号:当电子枪切换到新的一行准备扫描时,显示器会发送一个水平同步信号(Horizonal Synchronization),简称HSync;
垂直同步信号:完成一帧画面绘制后,电子枪会回到原位,显示器会发送一个垂直同步信号(Vertical Synchronization),简称VSync。
CUP计算好显示内容提交到GPU,GPU渲染完成后将渲染结果放入帧缓冲区,之后视频控制器按照VSync 信号逐行读取帧缓冲区中的数据,最后经过各种数模转换传递给显示器显示。
卡顿产生的原因:如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交到帧缓冲区,则那一帧就会被丢弃,等待下一次再显示,而这时显示屏会保留之前的内容不变,这就是掉帧,也就是卡顿的原因。
1、什么是CADisplayLink
对于iOS设备来说屏幕刷新频率是60HZ,也就是每个VSync是大约16.7ms,每秒最多60帧图片,掉帧了就会小于60帧。
CADisplayLink 简单说它是一个能让我们以和屏幕刷新率相同定时器,可以绑定target和selector。
CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新(掉帧的时候不会刷新)的时候,runloop就会调用CADisplayLink绑定的target上的selector。
duration属性:提供了每帧之间的时间,也就是屏幕每次刷新之间的的时间。CPU和GPU就是在这个时间里准备下一帧数据。
frameInterval属性:是可读可写的NSInteger型值,标识间隔多少帧调用一次selector 方法,默认值是1,即每帧都调用一次。如果每帧都调用一次的话,对于iOS设备来说那刷新频率就是60HZ也就是每秒60次,如果将 frameInterval 设为2 那么就会两帧调用一次,也就是变成了每秒刷新30次。
pause属性:控制CADisplayLink的运行。当我们想结束一个CADisplayLink的时候,应该调用-(void)invalidate 从runloop中删除并删除之前绑定的 target 跟 selector。
2、使用 CADisplayLink
计算屏幕刷新帧率,从数据上说明界面是否卡顿。参考YYKit 小工具YYFPSLabel,理解了上面的东西,很容易就看懂了它的实现原理。