iOS 探讨之 CADisplayLink

概述

“金九银十”,九月底我选择离开待了四年的公司。在与一些大厂的“交手”中,发现自己的确忽略了很多点。

从这个月开始,逐步的把那些点一一补充完整。Let’s get it。

探讨

1 Overview

官方话: 一个定时对象,该对象同步当前应用的渲染刷新频率。

(人话就是设备屏幕每刷新一次,该对象绑定的方法就会调用一次)

2 上下文

与渲染相关的类 CADisplayLink 必然属于 Core Animation 模块,故而集成于 QuartzCore Framework 内。

(其实从CADisplayLink这几个字母大概能猜到,CA,Core Animation 首字母简写。DisplayLink肯定是跟显示渲染相关)

扫描二维码关注公众号,回复: 6077509 查看本文章

直接父类为 NSObject , 所以其层级没那么深,知识结构稍微好理清一些。

3 成员属性及方法

public init(target: Any, selector sel: Selector)

初始化采用 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

资料

https://developer.apple.com/documentation/quartzcore/cadisplaylink#//apple_ref/doc/uid/TP40009031-CH1-DontLinkElementID_1

https://blog.csdn.net/wzzvictory/article/details/22417181

猜你喜欢

转载自blog.csdn.net/yanglei3kyou/article/details/83505135