“金九银十”,九月底我选择离开待了四年的公司。在与一些大厂的“交手”中,发现自己的确忽略了很多点。
从这个月开始,逐步的把那些点一一补充完整。Let’s get it。
官方话: 一个定时对象,该对象同步当前应用的渲染刷新频率。
(人话就是设备屏幕每刷新一次,该对象绑定的方法就会调用一次)
与渲染相关的类 CADisplayLink 必然属于 Core Animation 模块,故而集成于 QuartzCore Framework 内。
(其实从CADisplayLink这几个字母大概能猜到,CA,Core Animation 首字母简写。DisplayLink肯定是跟显示渲染相关)
直接父类为 NSObject , 所以其层级没那么深,知识结构稍微好理清一些。
初始化采用 Target-Action 模式,绑定后期回调需要的对象与事件。
注意点:
a. 红色框部分表明 CADisplayLink 类不能子类化,使用的时候直接实例化。
b. CADisplayLink实例会隐式retain当前所绑定的target。
open func add(to runloop: RunLoop, forMode mode: RunLoop.Mode)
与NSTimer类似,CADisplayLink实例需要将其加入指定RunLoop的指定Mode中去,这样绑定的事件才会持续执行。
注意点:
a. 加入到run-loop后,当前CADisplayLink实例会被隐式retain,故外部可以不持有该实例。
b. 只可以加入到一个run-loop中,但是可以一次加入到该run-loop的多个mode中。
open func remove(from runloop: RunLoop, forMode mode: RunLoop.mode)
移除在run-loop中的某个mode上的监听回调。
注意点:
a. 只有当CADisplayLink实例从run-loop的所有mode都移除后, 实例才会被隐式release。
open func invalidate()
移除run-loop中的所有mode的监听回调,销毁自身并release所绑定的target。
timestamp 当前帧时间戳
只读属性,单位秒(s)。
targetTimeStamp 下一帧时间戳
只读属性,单位秒(s),iOS10新出API。
注意:
a. iOS10以后可以使用 targetTimeStamp - timeStamp 算出两帧间隔时间,1/间隔时间 得出 FPS
duration 持续时间
只读属性,以maximumFramesPerSecond条件下的双帧间的间隔时间。
注意:
a. duration 与 targetTimeStamp-timeStamp 区别是,前者是在最大刷新频率下得出的结果,后者是实际运行得出的结果
isPaused 是否暂停
读写属性,当isPaused为true的时候,当前CADisplayLink暂停执行。为false的时候,正常执行。
注意:
a. 默认为false
b. 暂停 != CADisplayLink对象销毁
frameInterval 回调帧间隔
读写属性,每次函数回调间所需要的帧数,设置1代表每帧都会执行函数,设置2代表每两帧会执行一次函数。
注意:
a. 默认值为1
b. 间隔数小数1的时候系统任务无效
c. 此API iOS10以后舍去
preferredFramesPerSecond 倾向帧刷新频率
读写属性,可以通过设置preferredFramesPerSecond 来控制设备的刷新频率,但是实际上的不一定真的有效果。
还有一个因素是影响设备的刷新频率 — 设自身的最大刷新率。如果你的设备最大设置为 60帧,你设置的值超过60,
那么会按照60来执行。另外一方面 26~35之间的值的效果有可能和30一致。故它只是一个预估值。
注意:
a. 值的设置不一定有效果,需考虑设备本身能力
b. 当前设置是一种倾向,系统不一定严格按照数值进行设置
c. 默认值为0,如果设置成0,系统将根据设备自身的硬件选择最合适的频率刷新
d. 不能使用此值来计算FPS
e. iOS10新出API,用于替换 frameInterval
1 https://developer.apple.com/documentation/quartzcore/cadisplaylink#//apple_ref/doc/uid/TP40009031-CH1-DontLinkElementID_1
2 https://blog.csdn.net/wzzvictory/article/details/22417181