認識并使用 CADisplayLink

首先說一下屏幕刷新原理和卡頓產生的原因,方便對CADisplayLink的理解。

屏幕刷新原理.png

屏幕刷新原理:CRT的電子槍按照上圖中的方式,從上到下一行行掃描掃描完成后顯示器就呈現一幀畫面,隨后電子槍回到初始位置繼續下一次的掃描。
水平同步信號:當電子槍切換到新的一行準備掃描時,顯示器會發送一個水平同步信號(Horizonal Synchronization),簡稱HSync;
垂直同步信號:完成一幀畫面繪制后,電子槍會回到原位,顯示器會發送一個垂直同步信號(Vertical Synchronization),簡稱VSync。
CUP計算好顯示內容提交到GPU,GPU渲染完成后將渲染結果放入幀緩沖區,之后視頻控制器按照VSync 信號逐行讀取幀緩沖區中的數據,最后經過各種數模轉換傳遞給顯示器顯示。

卡頓產生的原因:如果在一個 VSync 時間內,CPU 或者 GPU 沒有完成內容提交到幀緩沖區,則那一幀就會被丟棄,等待下一次再顯示,而這時顯示屏會保留之前的內容不變,這就是掉幀,也就是卡頓的原因。

1、什么是CADisplayLink
  • 對于iOS設備來說屏幕刷新頻率是60HZ,也就是每個VSync是大約16.7ms,每秒最多60幀圖片,掉幀了就會小于60幀。

  • CADisplayLink 簡單說它是一個能讓我們以和屏幕刷新率相同定時器,可以綁定target和selector。

  • CADisplayLink 以特定的模式注冊到runloop之后,每當屏幕需要刷新(掉幀的時候不會刷新)的時候,runloop就會調用CADisplayLink綁定的target上的selector。

duration屬性:提供了每幀之間的時間,也就是屏幕每次刷新之間的的時間。CPU和GPU就是在這個時間里準備下一幀數據。
frameInterval屬性:是可讀可寫的NSInteger型值,標識間隔多少幀調用一次selector 方法,默認值是1,即每幀都調用一次。如果每幀都調用一次的話,對于iOS設備來說那刷新頻率就是60HZ也就是每秒60次,如果將 frameInterval 設為2 那么就會兩幀調用一次,也就是變成了每秒刷新30次。

pause屬性:控制CADisplayLink的運行。當我們想結束一個CADisplayLink的時候,應該調用-(void)invalidate 從runloop中刪除并刪除之前綁定的 target 跟 selector。

2、使用 CADisplayLink

計算屏幕刷新幀率,從數據上說明界面是否卡頓。參考YYKit 小工具YYFPSLabel,理解了上面的東西,很容易就看懂了它的實現原理。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容