tableview效能優化

2021-07-26 12:55:44 字數 2829 閱讀 3423

uitableview 最核心的部分就是 uitableviewcell 的重用機制(初學者必問面試題.通俗的說: uitableview 有乙個 cell 物件的重用池,其中存放著當前頁面顯示的 cell(在某些裝置上,可能會再多幾個.當 uitableview 滾動時,離開螢幕的 cell 會被放到重用池中.有新的 cell 要顯示,則又從重用池中取.這樣的好處顯而易見,如果 uitableview 有一萬行,我們不需要真的去建立一萬個 cell 物件.

如果我們的 uitableviewcell 有複雜的動態高度,那麼我們需要快取每個 cell 的高度.因為 uitableview 是繼承 uiscrollview,需要先確定 contentsize.既然我們的 cell 需要動態計算高度的,如果我們有一萬個 cell, 那麼在建立 uitableview 時- (cgfloat)tableview:(uitableview *)tableview heightforrowatindexpath:(nsindexpath *)indexpath;會被呼叫一萬次哦.如果你 reload 一下,又是一萬次哦~.當 uitableview 滾動時,又會呼叫- (cgfloat)tableview:(uitableview *)tableview heightforrowatindexpath:(nsindexpath *)indexpath;既然這個方法會被呼叫那麼多次,我們可以在網路到 uitableview 的資料來源時,計算出乙個 cell 高度陣列.

透明圖層對渲染效能會有一定的影響,因為混合(blending)是渲染中最慢的操作,系統會將透明圖層與下面的檢視混合起來計算並繪製圖層屬性,減少透明圖層並使用不透明的圖層來替代它們,在不透明的檢視裡標明 opaque 屬性以避免無用的 alpha 通道合成,可以大量提高 gpu 的計算速度.

可以通過 instrument 的 core animation 中開啟 color blended layers

,然後紅色的部分就是我們需要重點消滅的區域.

calayer 的 border、圓角、陰影、遮罩(mask),cashapelayer 的向量圖形顯示,通常會觸發離屏渲染(offscreen rendering).與之相對的是當前螢幕渲染(on-screen rendering),指的是渲染操作是用於在當前螢幕顯示的緩衝區進行.離屏渲染的概念來自於 opengl 中 gpu 渲染螢幕的兩種方式: on-screen rendering(當前螢幕渲染)off-screen rendering(離屏渲染)。 指的是:在當前螢幕以外新開闢乙個緩衝區進行渲染操作。離屏渲染造成卡頓的原因是:離屏渲染需要多次切換上下文環境,先是從當前螢幕(on-screen)切換到離屏(off-screen),等到離屏渲染結束以後,將離屏緩衝區的渲染結果顯示到螢幕上又需要將上下文環境從離屏切換到當前螢幕,而上下文環境的切換是一項高開銷的動作。

通常我們會乙個 view 設定陰影會使用shadowoffset

123

4

uiview *diamondview = [[uiview alloc] init];

diamondview.layer.shadowoffset = cgsizemake(1.0f, 1.0f);

diamondview.layer.shadowradius = 5.0f;

diamondview.layer.shadowopacity = 0.5;

但是這種方式會觸發離屏渲染造成不必要的開銷,那麼既要實現陰影圖層,又要減少離屏渲染,提高效能的話.有什麼更好的方式麼?

1

23

uiview *diamondview = [[uiview alloc] init];

diamondview.layer.shadowpath = [uibezierpath bezierpathwithrect:cgrectmake(diamondview.bounds.origin.x + 1, diamondview.bounds.origin.y + 1, diamondview.bounds.size.width, diamondview.bounds.size.height)].cgpath;

imageview.layer.shadowopacity = 0.5

;

但是shadowpath只適用於給規則的矩形生成陰影路徑.如果我們迫不得已要使用shadowoffset,可以嘗試開啟 calayer.shouldrasterize 屬性, 影象將會被快取起來並繪製到實際圖層的 contents 和子圖層.將原本在 gpu 中的一些工作讓 cpu 來做,讓兩者達到乙個平衡.但是這並不是有乙個全優解,因為光柵化原始影象需要時間,而且會消耗額外的記憶體.所以一定要避免在內容不斷變動的圖層上使用,不然快取的優勢將蕩然無存.

最完美的解決方案是使用 core graphics 繪製圓角 uiimage 設定給 uiimageview 然後插入到 uiview 中去。

當快速滑動 uitableview 的時候,計算出將要滾動到的 cell 開始預載入,在滾動過程中的 cell 選擇不載入,這樣可以極大的提高流暢度,同時也會出現乙個問題就是,過程中會出現大量白色的 cell.簡單實現了下:

先監聽 scrollview 的滾動事件 

tip減少 cell 中的 subview 的數量

盡可能使用靜態 cell

使用rowheight,sectionfooterheightsectionheaderheight來設定固定的高度

減少 cell 的種類,過多的 cellindentifier 使 cell 的重用池中存在大量的 cell 例項物件.

分享到

TableView效能優化

tableview效能優化是乙個老生常談的問題了,最近也正在做tableview的效能優化,在此我也做乙個總結 uitableview只會建立一螢幕 或者一螢幕多一點 的cell,其他都是取出來重用的。每當cell滑出螢幕的時候,就會放到乙個集合中,當要顯示某一位置的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 ...