卡頓產(chǎn)生的原因
在 VSync 信號到來后,系統(tǒng)圖形服務(wù)會通過 CADisplayLink 等機制通知 App喉镰,App 主線程開始在 CPU 中計算顯示內(nèi)容常空,比如視圖的創(chuàng)建翘狱、布局計算、圖片解碼熊咽、文本繪制等莫鸭。隨后 CPU 會將計算好的內(nèi)容提交到 GPU 去,由 GPU 進行變換横殴、合成被因、渲染。隨后 GPU 會把渲染結(jié)果提交到幀緩沖區(qū)去衫仑,等待下一次 VSync 信號到來時顯示到屏幕上梨与。由于垂直同步的機制,如果在一個 VSync 時間內(nèi)文狱,CPU 或者 GPU 沒有完成內(nèi)容提交粥鞋,則那一幀就會被丟棄,等待下一次機會再顯示瞄崇,而這時顯示屏?xí)A糁暗膬?nèi)容不變呻粹。這就是界面卡頓的原因。
在開發(fā)中苏研,CPU和GPU中任何一個壓力過大等浊,都會導(dǎo)致掉幀現(xiàn)象,所以在開發(fā)時摹蘑,也需要分別對CPU和GPU壓力進行評估和優(yōu)化筹燕。
iOS 設(shè)備中的 CPU & GPU
CPU
加載資源,對象創(chuàng)建,對象調(diào)整庄萎,對象銷毀踪少,布局計算,Autolayout糠涛,文本計算,文本渲染兼犯,圖片的解碼忍捡, 圖像的繪制(Core Graphics)都是在CPU上面進行的。
GPU
GPU是一個專門為圖形高并發(fā)計算而量身定做的處理單元切黔,比CPU使用更少的電來完成工作并且GPU的浮點計算能力要超出CPU很多砸脊。
GPU的渲染性能要比CPU高效很多,同時對系統(tǒng)的負載和消耗也更低一些纬霞,所以在開發(fā)中凌埂,我們應(yīng)該盡量讓CPU負責(zé)主線程的UI調(diào)動,把圖形顯示相關(guān)的工作交給GPU來處理诗芜,當(dāng)涉及到光柵化等一些工作時瞳抓,CPU也會參與進來,這點在后面再詳細描述伏恐。
相對于CPU來說孩哑,GPU能干的事情比較單一:接收提交的紋理(Texture)和頂點描述(三角形),應(yīng)用變換(transform)翠桦、混合(合成)并渲染横蜒,然后輸出到屏幕上。通常你所能看到的內(nèi)容销凑,主要也就是紋理(圖片)和形狀(三角模擬的矢量圖形)兩類丛晌。
本文參考:LaiYoung_