首先說一下屏幕刷新原理和卡頓產生的原因霹粥,方便對CADisplayLink的理解灭将。
屏幕刷新原理:CRT的電子槍按照上圖中的方式,從上到下一行行掃描掃描完成后顯示器就呈現(xiàn)一幀畫面后控,隨后電子槍回到初始位置繼續(xù)下一次的掃描宗侦。
水平同步信號:當電子槍切換到新的一行準備掃描時,顯示器會發(fā)送一個水平同步信號(Horizonal Synchronization)忆蚀,簡稱HSync;
垂直同步信號:完成一幀畫面繪制后姑裂,電子槍會回到原位馋袜,顯示器會發(fā)送一個垂直同步信號(Vertical Synchronization),簡稱VSync舶斧。
CUP計算好顯示內容提交到GPU欣鳖,GPU渲染完成后將渲染結果放入幀緩沖區(qū),之后視頻控制器按照VSync 信號逐行讀取幀緩沖區(qū)中的數(shù)據茴厉,最后經過各種數(shù)模轉換傳遞給顯示器顯示泽台。
卡頓產生的原因:如果在一個 VSync 時間內,CPU 或者 GPU 沒有完成內容提交到幀緩沖區(qū)矾缓,則那一幀就會被丟棄怀酷,等待下一次再顯示,而這時顯示屏會保留之前的內容不變嗜闻,這就是掉幀蜕依,也就是卡頓的原因。
1琉雳、什么是CADisplayLink
對于iOS設備來說屏幕刷新頻率是60HZ样眠,也就是每個VSync是大約16.7ms,每秒最多60幀圖片翠肘,掉幀了就會小于60幀檐束。
CADisplayLink 簡單說它是一個能讓我們以和屏幕刷新率相同定時器,可以綁定target和selector束倍。
CADisplayLink 以特定的模式注冊到runloop之后被丧,每當屏幕需要刷新(掉幀的時候不會刷新)的時候,runloop就會調用CADisplayLink綁定的target上的selector肌幽。
duration屬性:提供了每幀之間的時間晚碾,也就是屏幕每次刷新之間的的時間。CPU和GPU就是在這個時間里準備下一幀數(shù)據喂急。
frameInterval屬性:是可讀可寫的NSInteger型值格嘁,標識間隔多少幀調用一次selector 方法,默認值是1廊移,即每幀都調用一次糕簿。如果每幀都調用一次的話探入,對于iOS設備來說那刷新頻率就是60HZ也就是每秒60次,如果將 frameInterval 設為2 那么就會兩幀調用一次懂诗,也就是變成了每秒刷新30次蜂嗽。
pause屬性:控制CADisplayLink的運行。當我們想結束一個CADisplayLink的時候殃恒,應該調用-(void)invalidate 從runloop中刪除并刪除之前綁定的 target 跟 selector植旧。
2、使用 CADisplayLink
計算屏幕刷新幀率离唐,從數(shù)據上說明界面是否卡頓病附。參考YYKit 小工具YYFPSLabel,理解了上面的東西亥鬓,很容易就看懂了它的實現(xiàn)原理完沪。