一.水平同步 垂直同步
(1)過去是CRT顯示器,需要電子槍從上到下一行一行掃描,掃描完成后顯示器就呈現(xiàn)一幀畫面。完成一幀畫面后,電子槍回到初始位置繼續(xù)下一次掃描。
(2)當(dāng)電子槍換到新的一行,準(zhǔn)備進行掃描時,顯示器會發(fā)出一個水平同步信號:HSync
(3)當(dāng)一幀畫面繪制完成后,電子槍回復(fù)到原位,準(zhǔn)備畫下一幀前,顯示器會發(fā)出一個垂直同步信號: VSync
(4)顯示器是固定頻率,比如iOS 顯示器是每秒60幀,16.6ms完成一幀
二. 緩沖區(qū)

(1)CPU、GPU、顯示器的工作原理如上圖所示,CPU 計算好顯示內(nèi)容提交到 GPU,GPU 渲染完成后將渲染結(jié)果放入幀緩沖區(qū),隨后視頻控制器會按照 VSync 信號逐行讀取幀緩沖區(qū)的數(shù)據(jù),經(jīng)過可能的數(shù)模轉(zhuǎn)換傳遞給顯示器顯示。
(2)為了解決效率問題,顯示系統(tǒng)通常會引入兩個緩沖區(qū),GPU 會預(yù)先渲染好一幀放入一個緩沖區(qū)內(nèi),下一幀渲染完成后,收到VSync,指針指向下一個緩沖區(qū)。防止畫面撕裂
三. 卡頓原因

(1)上圖可以看到,每個VSync之間有時間間隔,iOS 設(shè)備上是16.6ms。在這個時間內(nèi),CPU主線程計算布局,解碼圖片,創(chuàng)建視圖,繪制文本,計算完成后將內(nèi)容交給GPU,GPU變換,合成,渲染(詳細可學(xué)習(xí) OpenGL相關(guān)課程),放入幀緩沖區(qū)
(2)假如16.6ms內(nèi),CPU和GPU沒有來得及生產(chǎn)出一幀緩沖,那么這一幀會被丟棄,顯示器就會保持不變,繼續(xù)顯示上一幀內(nèi)容,這導(dǎo)致畫面卡頓
(3)無論CPU,GPU,哪個消耗時間過長,都會導(dǎo)致在16.6ms內(nèi)無法生成一幀緩存。
四.CPU 耗時操作(只說影響大的)
- Autolayout:自動布局,kuglerj進行過一些實驗,一個比較復(fù)雜的頁面,自定義代碼 話費 120ms,自動布局 180ms,所以自動布局比代碼布局多花費 50%時間,并且越復(fù)雜,子視圖越多,時間是不成比例,近似指數(shù)增長的
2.文本計算(寬高,位置):比如UILabel,文本是在主線程計算的
3.文本渲染:所有文本內(nèi)容控件,包括 UIWebView,排版和繪制都是在主線程進行的。當(dāng)顯示大量文本時,CPU 的壓力會非常大
4.圖片的解碼:當(dāng)你用 UIImage 或 CGImageSource 的那幾個方法創(chuàng)建圖片時,圖片數(shù)據(jù)并不會立刻解碼。圖片設(shè)置到 UIImageView 或者 CALayer.contents 中去,并且 CALayer 被提交到 GPU 前,CGImage 中的數(shù)據(jù)才會得到解碼。這一步是發(fā)生在主線程的,并且不可避免。
5.圖像的繪制:生成bitmap
五.GPU耗時操作
1.紋理渲染:所有的 Bitmap,包括圖片、文本、柵格化的內(nèi)容,最終都要由內(nèi)存提交到顯存,綁定為 GPU Texture。不論是提交到顯存的過程,還是 GPU 調(diào)整和渲染 Texture 的過程,都要消耗不少 GPU 資源。當(dāng)在較短時間顯示大量圖片時(比如 TableView 存在非常多的圖片并且快速滑動時),CPU 占用率很低,GPU 占用非常高,界面仍然會掉幀。
2.視圖的混合(重點):視圖混合,多個視圖混合到一起時,會消耗大量gpu計算,應(yīng)盡量避免alpha通道。alpha<1就會計算下一層視圖,增加消耗資源alpha,多層視圖
3.圖形的生成(重點):CALayer的圓角,陰影,遮罩都會觸發(fā)離屏渲染,快速滑動,CPU占用率少,GPU占用率非常高??梢蚤_啟calayer的光柵化,將離屏渲染轉(zhuǎn)接到cpu上。
六:圖片加載:對性能影響
1.從磁盤拷貝數(shù)據(jù)到內(nèi)核緩沖區(qū)
2.從內(nèi)核緩沖區(qū)復(fù)制數(shù)據(jù)到用戶空間
3.生成UIImageView,把圖像數(shù)據(jù)賦值給UIImageView
4.如果圖像數(shù)據(jù)為未解碼的PNG/JPG,解碼為位圖數(shù)據(jù)
5.CATransaction捕獲到UIImageView layer樹的變化
6.主線程Runloop提交CATransaction,開始進行圖像渲染
6.1 如果數(shù)據(jù)沒有字節(jié)對齊,Core Animation會再拷貝一份數(shù)據(jù),進行字節(jié)對齊。
6.2 GPU處理位圖數(shù)據(jù),進行渲染。
參考文章:
iOS 保持界面流暢的技巧