https://www.jianshu.com/p/b2a687248d00
一、頁面卡頓的原因
圖像的顯示原理:圖像的顯示需要GPU和CPU兩者配合,CPU主要負責視圖的創建,布局的計算和視圖的繪制,然后進行圖片的解碼,將生成的位圖交給GPU,GPU進行渲染,並將渲染的結果交到幀緩沖區,待下一個VSync 信號到來的時候視頻控制器從幀緩沖區取出數據,經過轉換,顯示到屏幕上。
如果在規定的16.7ms內,CPU和GPU的合作未完成,沒有生成新的渲染數據到幀緩沖區中,那么就會出現卡頓或者掉幀的情況。
二、頁面卡頓優化方案
那么針對卡頓和掉幀的優化方案,在知曉了圖像顯示需要CPU和GPU配合工作后,就可以從CPU和GPU兩方面入手:
CPU
1、盡量使用輕量級的對象,比如用不到事件處理的地方,可以考慮用CALayer取代UIView;
2、不要頻繁地調用UIView的相關屬性,比如frame、bounds、transform等屬性,盡量減少不必要的修改;
3、盡量提前計算好布局,在有需要時一次性調整對應的屬性,不要多次修改屬性;
4、Autolayout會比直接設置frame消耗更多的CPU資源;
5、圖片的size最好剛好跟UIImageView的size保持一致;
6、控制一下線程的最大並發數;
7、盡量把耗時的操作放到子線程
- 文本處理(尺寸計算、繪制)
- 圖片處理(解碼、繪制)
GPU
1、盡量減少視圖數量和層次;
2、盡量避免短時間內大量圖片的顯示,盡可能將多張圖片合成一張進行顯示;
3、GPU能處理的最大紋理尺寸是4096*4096,一旦超過這個尺寸,就會占用CPU資源進行處理,所以紋理盡量不要超過這個尺寸;
4、減少透明的視圖(alpha<1),不透明的就設置opaque為YES;
5、盡量避免出現離屏渲染。離屏渲染需要創建新的緩沖區,同時整個過程需要多次切換上下文環境,非常消耗性能。可能造成離屏渲染的原因如下:
- 光柵化,layer.shouldRasterize = YES
- 遮罩,layer.mask
- 圓角,同時設置layer.maskToBounds = YES、layer.cornerRadius大於0。考慮通過CoreGraphics繪制裁剪圓角,或者讓美工提供圓角圖片
- 陰影,layer.shadowXXX。如果設置了layer.shadowPath就不會產生離屏渲染
作者:焚雪殘陽
鏈接:https://www.jianshu.com/p/b2a687248d00
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
