如何優化tableView

冰凌天發表於2019-03-11

之前問到如何優化複雜UITableViewCell卡頓的問題, 有位大佬發了下面的一段文字, 在此記錄一下

  • 1.cell 的行高不是固定值,需要計算,則要儘可能快取行高值,避免重複計算行高。因為 heightForRowAtIndexPath:是呼叫最頻繁的方法。

  • 2.滑動時按需載入,這個在大量圖片展示,網路載入的時候很管用!(SDWebImage 已經實現異 步載入,配合這條效能槓槓的)。

  • 3.正確使用 reuseIdentifier 來重用 Cells

  • 4.儘量少用或不用透明圖層

  • 5.如果 Cell 內現實的內容來自 web,使用非同步載入,快取請求結果

  • 6.減少 subviews 的數量

  • 7.在 heightForRowAtIndexPath:中儘量不使用 cellForRowAtIndexPath:,如果你需要用到它, 只用一次然後快取結果

  • 8.所有的子檢視都預先建立,如果不需要顯示可以設定 hidden,儘量少動態給 Cell 新增 View

  • 9.顏色不要使用 alph

  • 10.柵格化

  • 11.cellsubViews 的各級 opaque 值要設成 YES,儘量不要包含透明的子 View opaque 用於輔助繪圖系統,表示 UIView 是否透明。在不透明的情況下,渲染檢視時需要快速 地渲染,以提?高效能。渲染最慢的操作之一是混合(blending)。提?高效能的方法是減少混合操 作的次數,其實就是 GPU 的不合理使用,這是硬體來完成的(混合操作由 GPU 來執行,因為這 個硬體就是用來做混合操作的,當然不只是混合)。 優化混合操作的關鍵點是在平衡 CPUGPU 的負載。還有就是 celllayershouldRasterize 要設成 YES

  • 12.cell 非同步載入圖片以及快取

  • 13.非同步繪製

    • (1)在繪製字串時,儘可能使用 drawAtPoint: withFont:,而不要使用更復雜的 drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode; 如果要繪製過長的字串,建議自己先截 斷,然後使用 drawAtPoint: withFont:方法繪製。

    • (2)在繪製圖片時,儘量使用 drawAtPoint,而不要使用 drawInRectdrawInRect 如果在繪 制過程中對圖片進行放縮,會特別消耗 CPU

    • (3)其實,最快的繪製就是你不要做任何繪製。有時通過 UIGraphicsBeginImageContextWithOptions() 或者 CGBitmapContextCeate() 建立點陣圖會顯 得更有意義,從點陣圖上面抓取影象,並設定為 CALayer 的內容。 如果你必須實現 -drawRect:,並且你必須繪製大量的東西,這將佔用時間。

    • (4)如果繪製 cell 過程中,需要下載 cell 中的圖片,建議在繪製 cell 一段時間後再開啟圖 片下載任務。譬如先畫一個預設圖片,然後在 0.5S 後開始下載本 cell 的圖片。

    • (5)即使下載 cell 圖片是在子執行緒中進行,在繪製 cell 過程中,也不能開啟過多的子執行緒。 最好只有一個下載圖片的子執行緒在活動。否則也會影響 UITableViewCell 的繪製,因而影響了 UITableViewCell 的滑動速度。(建議結合使用 NSOpeartionNSOperationQueue 來下載圖片, 如果想盡可能找的下載圖片,可以把[self.queuesetMaxConcurrentOperationCount:4];)

    • (6)最好自己寫一個 cache,用來快取 UITableView 中的 UITableViewCell,這樣在整個 UITableView 的生命週期裡,一個 cell 只需繪製一次,並且如果發生記憶體不足,也可以有效的 釋放掉快取的 cell

  • 14.不要將 tableview 的背景顏色設定成一個圖片。這回嚴重影響 UITableView 的滑動速度。在 限時免費搜尋裡,我曾經翻過一個錯誤:self.tableView_.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@"background.png"]]; 通過這種方式 設定 UITableView 的背景顏色會嚴重影響 UTIableView 的滑動流暢性。修改成 self.tableView_.backgroundColor = [UIColor clearColor];之後,fps43 上升到 60 左右。 滑動比較流暢。

相關文章