iOS 认识并使用 CADisplayLink

释放双眼,带上耳机,听听看~!

首先说一下屏幕刷新原理和卡顿产生的原因,方便对CADisplayLink的理解。

屏幕刷新原理.png

屏幕刷新原理: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,理解了上面的东西,很容易就看懂了它的实现原理。

人已赞赏
iOS文章

iOS-UITableViewCell三种常用编辑模式:删除,插入,移动

2019-10-18 13:55:34

iOS文章

iOS 用UIPickerView自定义日期选择器(仿UIDatePicker)

2019-10-19 23:40:50

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索