首先說(shuō)一下屏幕刷新原理和卡頓產(chǎn)生的原因,方便對(duì)CADisplayLink的理解。

屏幕刷新原理:CRT的電子槍按照上圖中的方式,從上到下一行行掃描掃描完成后顯示器就呈現(xiàn)一幀畫(huà)面,隨后電子槍回到初始位置繼續(xù)下一次的掃描。
水平同步信號(hào):當(dāng)電子槍切換到新的一行準(zhǔn)備掃描時(shí),顯示器會(huì)發(fā)送一個(gè)水平同步信號(hào)(Horizonal Synchronization),簡(jiǎn)稱(chēng)HSync;
垂直同步信號(hào):完成一幀畫(huà)面繪制后,電子槍會(huì)回到原位,顯示器會(huì)發(fā)送一個(gè)垂直同步信號(hào)(Vertical Synchronization),簡(jiǎn)稱(chēng)VSync。
CUP計(jì)算好顯示內(nèi)容提交到GPU,GPU渲染完成后將渲染結(jié)果放入幀緩沖區(qū),之后視頻控制器按照VSync 信號(hào)逐行讀取幀緩沖區(qū)中的數(shù)據(jù),最后經(jīng)過(guò)各種數(shù)模轉(zhuǎn)換傳遞給顯示器顯示。
卡頓產(chǎn)生的原因:如果在一個(gè) VSync 時(shí)間內(nèi),CPU 或者 GPU 沒(méi)有完成內(nèi)容提交到幀緩沖區(qū),則那一幀就會(huì)被丟棄,等待下一次再顯示,而這時(shí)顯示屏?xí)A糁暗膬?nèi)容不變,這就是掉幀,也就是卡頓的原因。
1、什么是CADisplayLink
對(duì)于iOS設(shè)備來(lái)說(shuō)屏幕刷新頻率是60HZ,也就是每個(gè)VSync是大約16.7ms,每秒最多60幀圖片,掉幀了就會(huì)小于60幀。
CADisplayLink 簡(jiǎn)單說(shuō)它是一個(gè)能讓我們以和屏幕刷新率相同定時(shí)器,可以綁定target和selector。
CADisplayLink 以特定的模式注冊(cè)到runloop之后,每當(dāng)屏幕需要刷新(掉幀的時(shí)候不會(huì)刷新)的時(shí)候,runloop就會(huì)調(diào)用CADisplayLink綁定的target上的selector。
duration屬性:提供了每幀之間的時(shí)間,也就是屏幕每次刷新之間的的時(shí)間。CPU和GPU就是在這個(gè)時(shí)間里準(zhǔn)備下一幀數(shù)據(jù)。
frameInterval屬性:是可讀可寫(xiě)的NSInteger型值,標(biāo)識(shí)間隔多少幀調(diào)用一次selector 方法,默認(rèn)值是1,即每幀都調(diào)用一次。如果每幀都調(diào)用一次的話,對(duì)于iOS設(shè)備來(lái)說(shuō)那刷新頻率就是60HZ也就是每秒60次,如果將 frameInterval 設(shè)為2 那么就會(huì)兩幀調(diào)用一次,也就是變成了每秒刷新30次。
pause屬性:控制CADisplayLink的運(yùn)行。當(dāng)我們想結(jié)束一個(gè)CADisplayLink的時(shí)候,應(yīng)該調(diào)用-(void)invalidate 從runloop中刪除并刪除之前綁定的 target 跟 selector。
2、使用 CADisplayLink
計(jì)算屏幕刷新幀率,從數(shù)據(jù)上說(shuō)明界面是否卡頓。參考YYKit 小工具YYFPSLabel,理解了上面的東西,很容易就看懂了它的實(shí)現(xiàn)原理。