tableview效能優化是乙個老生常談的問題了,最近也正在做tableview的效能優化,在此我也做乙個總結:
uitableview只會建立一螢幕(或者一螢幕多一點)的cell,其他都是取出來重用的。每當cell滑出螢幕的時候,就會放到乙個集合中,當要顯示某一位置的cell時,會先去集合中取,有的話,就直接拿出來顯示,沒有在建立。
cell賦值內容時,會根據內容設定布局,也就可以知道cell的高度,若有1000行,就會呼叫1000次 cellforrow方法,而我們對cell的處理操作,都是在這個方法中賦值,布局等等,開銷很大。
3.優化方法
3.1優化:heightforrow方法處理cell高度。
思路:賦值和計算布局分離。cellforrow負責賦值,heightrorrow負責計算高度。
3.2自定義cell繪製:
各個資訊都是根據之前算好的布局進行繪製的。需要非同步繪製。重寫draerect方法就不需要非同步繪製了,因為drawrect本來就是非同步繪製的。**混排的繪製,coretext繪製。
3.3按需載入(uiscrollview方面):
如果目標行與當前行相差超過指定行數,只在目標滾動範圍的前後制定n行載入。滾動很快時,只載入目標範圍內得cell,這樣按需載入,極大地提高了流暢性。
1.提前計算並快取好高度,因為heightforrow最頻繁的呼叫。
2.cellforrow方法裡儘量減少計算量和**量。
3.滑動時按需載入,這個在大量展示,網路載入時,很管用。(sdwebimage已經實現非同步載入)。
4.重用cells。
5.如果cell內顯示得內容來自web,使用非同步載入,快取結果請求。
6.少用或不用透明圖層,使用不透明檢視,少使用圓角、陰影等。
7.用**代替xib檔案,用手動設定frame方式代替自動布局。(xib和自動布局比較耗時)
8.cell檔案裡邊能提前算好的盡量快取起來,避免多次計算。
9.少用addview給cell動態新增view,可以初始化的時候就新增,然後通過hide控制是否顯示。
1. 非同步繪製,遇到複雜介面,效能瓶頸時,可能是突破口。
2.模仿或者使用yykit的設計思想,從底層影象繪製原理層面,去進行介面的繪製和布局。
3.解碼。解碼的原理也很簡單,提前把繪製到乙個cgcontext中,再從context獲取,這樣能夠強制解碼。通常三方庫(kingfisher,sdwebimage)都自帶後台解碼。
5.從影象渲染、cpu和gpu處理影象操作方面做優化。
引用其他博主的總結:
1.效能分析就是一句話:能放到後台的就放到後台,不能放到後台的要麼預載入,要麼拆分。另外還有乙個facebook出品的三方庫非常推薦:
texture
,這個是乙個非同步顯示框架,會省去很多事。
介面頓卡主要從兩個角度考慮
cpu限制:
物件的建立,釋放,屬性調整。這裡尤其要提一下屬性調整,calayer的屬性調整的時候是會建立隱式動畫的,是比較損耗效能的。
檢視和文字的布局計算,autolayout的布局計算都是在主線程上的,所以占用cpu時間也很多 。u
文字渲染,諸如uilabel和uitextview都是在主線程渲染的
的解碼,這裡要提到的是,通常uiimage只有在交給gpu之前的一瞬間,cpu才會對其解碼。
gpu限制:
檢視的混合。比如乙個介面十幾層的檢視疊加到一起,gpu不得不計算每個畫素點藥顯示的畫素
離屏渲染。檢視的mask,圓角,陰影。
半透明,gpu不得不進行數學計算,如果是不透明的,cpu只需要取上層的就可以了
浮點數畫素
使用facebook出品的asyncdisplaykit來寫複雜的介面。能夠獲得非同步繪製,預先載入等諸多好處。不過,需要一定的學習成本,前段時間看了下網易新聞的安裝包,就使用了asyncdisplaykit
yykit
dtcoretext
把複雜的介面,放到後台執行緒裡繪製成乙個bitmap,然後再顯示。雖然有些延遲,不過換來的卻是平滑的介面。
建議使用成熟的庫,比如sdwebimage等,能夠在後台進行解碼,減少cpu的使用。
對於複雜的tableview,可以對cell檢視的各個控制項的大小,位置後台進行預計算,並且快取起來。這樣保證在heightforrow
和cellforrow
中不進行大量的計算。
因為layer是乙個輕量級的檢視結構,它不接受通知,不接受觸控,不在響應鏈。所以,相對於uiview來說,它的效能較好。並且calayer及其子類是可以使用gpu渲染的,能夠硬體加速。
將兩個calayer的內容合成到乙個bitmap裡,然後顯示。能夠減輕gpu的壓力
tableview效能優化
uitableview 最核心的部分就是 uitableviewcell 的重用機制 初學者必問面試題.通俗的說 uitableview 有乙個 cell 物件的重用池,其中存放著當前頁面顯示的 cell 在某些裝置上,可能會再多幾個.當 uitableview 滾動時,離開螢幕的 cell 會被放...
tableView效能優化
在自定義cell時加上這幾句 1.柵格化,美工的術語 將 cell 中的所有內容,生成一張獨立的影象 在螢幕滾動時,只顯示影象 self.layer.shouldrasterize yes 柵格化,必須指定解析度,否則預設使用 1,生成影象!self.layer.rasterizationscale...
iOS效能優化 TableView
下面介紹一些我們可以自己設定的新能優化 1 盡量不透明的檢視 不透明檢視可以極大提高渲染的速度.因此如果可以,將 cell 及其子檢視的 opaque 屬性設定為 yes 預設值 cell 的 backgroundcolor 的 apha 值應為1 不要使用 clearcolor 影象的 apha ...