本質上是降低 CPU、GPU 的工作,從這兩個大的方面去提升性能。
- CPU:對象的創(chuàng)建和銷毀、對象屬性的調整、布局計算、文本的計算和排版、圖片的格式轉換和解碼、圖像的繪制
- GPU:紋理的渲染
卡頓優(yōu)化在 CPU 層面
- 盡量用輕量級的對象,比如用不到事件處理的地方,可以考慮使用 CALayer 取代 UIView
- 不要頻繁地調用 UIView 的相關屬性,比如 frame、bounds、transform 等屬性,盡量減少不必要的修改
- 盡量提前計算好布局,在有需要時一次性調整對應的屬性,不要多次修改屬性
- Autolayout 會比直接設置 frame 消耗更多的 CPU 資源
- 圖片的 size 最好剛好跟 UIImageView 的 size 保持一致
- 控制一下線程的最大并發(fā)數(shù)量
- 盡量把耗時的操作放到子線程
- 文本處理(尺寸計算、繪制)
- 圖片處理(解碼、繪制)
卡頓優(yōu)化在 GPU層面
- 盡量避免短時間內大量圖片的顯示,盡可能將多張圖片合成一張進行顯示
- GPU能處理的最大紋理尺寸是 4096x4096,一旦超過這個尺寸,就會占用 CPU 資源進行處理,所以紋理盡量不要超過這個尺寸
- 盡量減少視圖數(shù)量和層次
- 減少透明的視圖(alpha<1),不透明的就設置 opaque 為 YES
- 盡量避免出現(xiàn)離屏渲染
1.預排版,提前計算
在接收到服務端返回的數(shù)據(jù)后,盡量將 CoreText 排版的結果、單個控件的高度、cell 整體的高度提前計算好,將其存儲在模型的屬性中。需要使用時,直接從模型中往外取,避免了計算的過程。
盡量少用 UILabel,可以使用 CALayer 。避免使用 AutoLayout 的自動布局技術,采取純代碼的方式
2.預渲染,提前繪制
例如圓形的圖標可以提前在,在接收到網(wǎng)絡返回數(shù)據(jù)時,在后臺線程進行處理,直接存儲在模型數(shù)據(jù)里,回到主線程后直接調用就可以了
避免使用 CALayer 的 Border、corner、shadow、mask 等技術,這些都會觸發(fā)離屏渲染。
3.異步繪制
4.全局并發(fā)線程
5.高效的圖片異步加載
更多:iOS面試題合集