標籤:
1.為什麼出現頁面卡頓?
在開發中我們常常會遇到布局比較複雜的cell,在滑動的時候會導致介面不流暢,出現卡頓的現象,這是由於CPU計算和GPU渲染,之間未及時交換資料丟失幀導致的結果。
2.常見解決辦法1).UIImageView盡量設定為不透明
當UIImageView的opque設定為YES的時候其alpha的屬性就會無效,UIImageView的半透明取決於其圖片半透明或者UIImageView本身的背景色合成的圖層view是半透明的。
如果圖片全部不是半透明就不會觸發圖層的blend操作,整個圖層就會不透明。
如果疊加的圖片有出現半透明的,就會立馬觸發圖層的blend操作,整個圖層不透明。
當某一塊圖層的alpha和其superView的背景色alpha不一樣的時候會觸發alpha合成操作,這是一項看似很簡單但卻是非常消耗CPU效能的操作。
2).UIView的背景色設定
3).cell上layer盡量避免使用圓角
在工作中關於滑動介面我們會時常遇到cell行設定頭像為圓角等需求,這時候我們盡量避免使用layder.cornerRadius,因為這會觸發離屏渲染。離屏渲染很耗時間。
離屏渲染:是GPU渲染區的一個渲染緩衝區,我們所用的所有顯示屏的圖形映像都是通過GPU進行渲染,然後顯示在螢幕上。GPU負責渲染會把渲染的圖形放到緩衝區然後CPU就會發一個垂直訊號顯示到螢幕。
如果要使用圓角,我們可以設定為layer.shouldRasterize = YES,其實這個設定是觸發光柵化,可以大大提高渲染的效能。我的理解光柵化就是類似於cell的重用機制。
光柵化:把第一次渲染好的圖層放到緩衝區,那麼下次不需要再離屏渲染直接就可以從緩衝區拿去使用。
4).最佳化圖片的載入方式
圖片的載入方式有兩種形式:
UIImageView *image = [UIImageView imageView:@"1.png"];
UIImageView *image = [UIImageView imageWithContentOfFile:@"1.png"];
兩種載入圖片方式的區別:
第一種:當我們經常需要這張圖片並且僅僅是小圖的時候,我們可以使用此種方式載入圖片。
這種方式是把圖片緩衝在圖片緩衝區,當我們使用的時候會通過圖片的名字也就是通過key的方式去尋找圖片在緩衝區的記憶體位址。
當我們使用很多圖片的時候系統就會開闢很多記憶體來儲存圖片,所以qq、我們很多時候都會去清除快取作業。
第二種:當我們使用工程裡面的一張大圖並且使用次數很少甚至為1次的時候,我們優先會採用這種方式載入圖片,這種方式當使用完圖片的時候會立即丟棄釋放資源,所以對效能不會帶來負擔。
5).盡量延遲圖片的載入
當我們在滑動頁面的時候尤其對於那種布局特別複雜的cell,滑動的時候不要載入圖片,當滑動停止得時候再進行圖片的載入。
我們都知道不管是UITableView還是UIScrollView在滾動的時候需要顯示東西都是通過runLoop去拿。
當滾動的時候runLoop會處於NSRunLoopTrackingMode的模式,我們可以通過一個主線程隊列dispatch_after或者selfPerformSelector設定runLoop的模式為NSDefaultRunLoopMode模式,就可以做到停止滾動再載入圖片。
註:其實嚴格意義上selfPerformSelector的事件就是在主線程隊列中等待。
優先載入理念
採用優先載入的理念,既先展示一部分,當滑動的時候再載入下面的一部分這樣就保持流暢。
6).避免阻塞主線程
- 讓圖片的繪製、圖片的下載、對象的建立、文本的渲染等這些耗時的操作儘可能採用子線程非同步方式去處理,對於layer及UI的操作不得不在主線程裡面,只能想辦法最佳化。
7).xib、storyBoard、純程式碼的問題
iOS中解決頁面卡頓小技巧(很常用)