iOS繪圖事務的運行驗證
結合WWDC,以我們的call stack為例,來說明這四個過程分別大概都做了什麽。
layout過程
從上面layout的過程可以看出,其所做的主要任務就是將圖層調用代理(也就是視圖)實現整個視圖層級的布局;比較有意思的是,autolayout
的約束也是在這個時候更新和施加apply
的(-[UIView(Hierarchy) _updateConstraintsAsNecessaryAndApplyLayoutFromEngine]
)。
display過程
按照WWDC視頻的說法,display
這個階段是負責draw圖層的內容。如果你的某些視圖實現了drawRect:
方法或者其他UIKit提供的視圖采用了圖層的drawInContext:
CPU bound
(受限於CPU性能)的。
prepare過程
prepare過程也是Core Animation
準備圖層內容的環節,但是這個過程的準備是給那些沒有實現drawInContext:
(視頻說的是drawRect
,但實際上drawRect
的底層是圖層的drawInContext
)而通過其他方式設置圖層內容的視圖準備的;比如,UIImageView,它的實現就是直接解碼壓縮格式的png圖,設置給其layer的contents屬性的。那麽圖片解碼的過程就在這個prepare階段。
commit過程
commit階段是講所有的圖層數據打包,通過進程間通信給到render server(另外一個進程)來繪制顯示到屏幕上。通常情況下,CPU的工作在這個階段是比較少的-從上面的10次重復動畫來看,這個過程僅僅分擔了1ms左右的cpu時間。但是WWDC指出,如果你的視圖層級過於復雜,有非常多的圖層,那這個commit的過程也會耗費比較長的時間。
https://www.awsomejiang.com/2018/03/06/about-core-animtion-animation-stages/
iOS繪圖事務的運行驗證