之前問到如何優化複雜
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.
cell
的subViews
的各級opaque
值要設成 YES,儘量不要包含透明的子View
opaque
用於輔助繪圖系統,表示UIView
是否透明。在不透明的情況下,渲染檢視時需要快速 地渲染,以提?高效能。渲染最慢的操作之一是混合(blending
)。提?高效能的方法是減少混合操 作的次數,其實就是GPU
的不合理使用,這是硬體來完成的(混合操作由GPU
來執行,因為這 個硬體就是用來做混合操作的,當然不只是混合)。 優化混合操作的關鍵點是在平衡CPU
和GPU
的負載。還有就是cell
的layer
的shouldRasterize
要設成YES
。 -
12.
cell
非同步載入圖片以及快取 -
13.非同步繪製
-
(1)在繪製字串時,儘可能使用
drawAtPoint: withFont:
,而不要使用更復雜的drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode
; 如果要繪製過長的字串,建議自己先截 斷,然後使用drawAtPoint: withFont:
方法繪製。 -
(2)在繪製圖片時,儘量使用
drawAtPoint
,而不要使用drawInRect
。drawInRect
如果在繪 制過程中對圖片進行放縮,會特別消耗CPU
。 -
(3)其實,最快的繪製就是你不要做任何繪製。有時通過
UIGraphicsBeginImageContextWithOptions()
或者CGBitmapContextCeate()
建立點陣圖會顯 得更有意義,從點陣圖上面抓取影象,並設定為CALayer
的內容。 如果你必須實現-drawRect:
,並且你必須繪製大量的東西,這將佔用時間。 -
(4)如果繪製
cell
過程中,需要下載cell
中的圖片,建議在繪製cell
一段時間後再開啟圖 片下載任務。譬如先畫一個預設圖片,然後在 0.5S 後開始下載本cell
的圖片。 -
(5)即使下載
cell
圖片是在子執行緒中進行,在繪製cell
過程中,也不能開啟過多的子執行緒。 最好只有一個下載圖片的子執行緒在活動。否則也會影響UITableViewCell
的繪製,因而影響了UITableViewCell
的滑動速度。(建議結合使用NSOpeartion
和NSOperationQueue
來下載圖片, 如果想盡可能找的下載圖片,可以把[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];
之後,fps
從43
上升到60
左右。 滑動比較流暢。