1、CPU工作:
Layout :UI布局(frame级乍、size)舌劳、文本計(jì)算
Display: 繪制(drawRact)
Prepare:圖片編解碼(UIImage等)
Commit: 位圖提交
2、GPU渲染管線(OpenGL渲染管線)
頂點(diǎn)著色玫荣、圖元裝配甚淡、光柵化、片段著色捅厂、片段處理------->所有處理完成后贯卦,將像素點(diǎn)提交到幀緩沖區(qū)(FrameBuffer)。
一焙贷、UI卡頓撵割、掉幀原因
1s有60幀畫面
二、優(yōu)化方案
CPU:
子線程異步操作:?
對象創(chuàng)建辙芍、銷毀啡彬、調(diào)整;
預(yù)排版(布局計(jì)算沸手、文本計(jì)算)外遇;
預(yù)渲染(文本等異步繪制注簿、圖片編解碼等)
GPU:
避免紋理渲染(圓角契吉、動畫、蒙層等)诡渴,可以異步繪制避免
避免視圖混合(層級復(fù)雜等)捐晶,可以異步繪制避免
三、異步繪制
.layer setNeedDisplay 方法調(diào)用后系統(tǒng)不會馬上調(diào)用 [CALayer display]妄辩,而是在當(dāng)前 layer 打上一個臟標(biāo)記惑灵,會等到當(dāng)前 Loop 將要結(jié)束時再調(diào)用 display 方法執(zhí)行
系統(tǒng)繪制流程:
異步繪制:
--- [layer.delegate? dispayer:]
· 代理負(fù)責(zé)生成對應(yīng)的 bitmap
· 設(shè)置該 bitmap 作為 layer.contents 屬性的值
流程:
四、離屏渲染
在屏渲染(On-Screen Rendering):
當(dāng)前屏幕渲染眼耀,指GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩沖區(qū)中進(jìn)行
離屏渲染(Off-Screen Rendering):
離屏渲染英支,指GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作(圓角屬性、蒙層操作等)
何時觸發(fā):
· 圓角(當(dāng)和 maskToBounds 一起使用時)
· 圖層蒙版
· 陰影
· 光柵化
為何要避免:
· 創(chuàng)建新的渲染緩沖區(qū)哮伟,內(nèi)存開銷增加
· 上下文切換干花,因?yàn)槎嗤ǖ冷秩竟芫€的合成
· 增加GPU工作量妄帘,可能會導(dǎo)致CPU+GPU操作時間超出了一幀16.7s ,會導(dǎo)致卡頓池凄、掉幀