認(rèn)識(shí)并使用 CADisplayLink

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

屏幕刷新原理.png

屏幕刷新原理: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)原理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容