iOS卡頓優化方案


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就不會產生離屏渲染
 
 
5人點贊
 
 


作者:焚雪殘陽
鏈接:https://www.jianshu.com/p/b2a687248d00
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM