iOS 卡頓優化

2021-10-03 13:46:05 字數 1604 閱讀 6927

卡頓優化:

卡頓主要是在主線程執行了比較耗時的操作。

cpu:(central processing unit,**處理器)負責,物件的建立和銷毀、物件屬性的調整、布局計算、文字的計算和排版、的格式轉換和解碼、影象的繪製(co re graphics)。

gpu:(graphics processing unit,圖形處理器) 負責紋理的渲染。

卡頓產生的原因:

螢幕上每一幀資料的展示過程是:cpu先計算好資料,然後給到gpu渲染,渲染完成後的資料放到幀快取裡, 當接收到乙個垂直同步訊號(vsync)時,就需要馬上把cpu就算好,gpu渲染好的資料顯示到螢幕上。如果垂直同步訊號(vsync)來的時候,cpu還沒計算好或者gpu還沒渲染好, 此時展示到螢幕上的資料就是上一幀的,當前的幀資料需要等下乙個或者下下個垂直同步訊號(vsync)開的時候才能展示到螢幕上;這種現象就是掉幀。

所以解決卡頓的主要思路就是:盡可能減少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、gpu能處理的最大紋理尺寸是4096x4096,一旦超過這個尺寸,就會占用cpu資源進行處理。

3、儘量減少檢視數量和層次。

4、減少透明的檢視(alpha<1),不透明的就設定opaque為yes(預設就是yes)。

5、盡量避免出現離屏渲染。

離屏渲染:

在opengl中,gpu有兩種渲染方式:

on-screen rendering:當前螢幕渲染,在當前用於顯示的螢幕緩衝區進行渲染操作。

off-screen rendering:離屏渲染,在當前螢幕緩衝區外新開闢乙個緩衝區進行渲染操作。

離屏渲染消耗效能的原因:

1、需要建立新的緩衝區。

2、離屏渲染整個過程,需要多次切換上下文環境,先是從當前螢幕切換到離屏,等到離屏渲染結束後,將緩衝區的渲染結果展示到螢幕上,又需要將上下文環境從離屏切換到當前螢幕。

造成離屏渲染的操作:

1、光柵化,layer.shouldrasterize = yes。

2、遮罩,layer.mask。

3、圓角,同時設定layer.masktobounds = yes,layer.cornerradius大於0。(可以通過coregraphics繪製裁剪圓角)。

4、陰影,layer.shadowoffset(可以通過設定layer.shadowpath,就不會產生離屏渲染)。

卡頓檢測:

可以新增observer 到主線程runloop中,通過監聽runloop狀態切換的耗時,以達到監聽卡頓的目的。

iOS APP卡頓優化

on screen rendering 當前螢幕渲染,在當前用於顯示的螢幕緩衝區進行渲染操作 off screen rendering 離屏渲染,在當前螢幕緩衝區以外開闢乙個新的緩衝區進行渲染操作 需要建立新的緩衝區 離屏渲染的整個過程,需要多次切換上下文環境,先試從當前螢幕 on screen 切...

iOS開發之優化tableView卡頓現象

1.復用單元格 2.使用不透明的試圖,單元格中盡量少使用動畫 3.使用非同步載入同時設定載入的併發數 4.滑動時不載入,滑動結束開始載入 5.文字可以直接drawinrect繪製 6.非必要條件下,減少重新整理的cell 7.如果cell是動態行高,可直接計算高度後快取 首先重用cell 其次可以用...

mysql定期卡頓 MySQL卡頓和優化

1.若是是你,你怎麼處理慢查詢引發的問題,而且在之後避免這種狀況發生?sql 對於mysql的慢查詢問題,一般咱們是這麼幹的 1 開啟mysql伺服器的慢查詢記錄功能 mysql set global slow query log on mysql show variables like slow ...