容易忽視的效能殺手:TableView重新整理優化特例
在 TableView優化檢查清單 一篇中,例出了TableView優化常見的一些入手點,本篇將給出一個在特定效果下,會影響TableView 重新整理效率的一種情形及優化方法,在你決定用複雜方法優化TableView時,提前排除這種可能。
簡單的文字也會導致低重新整理率
本例中,cell將顯示3000個數字:

TableView效果
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"KeyCell"]; cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row]; cell.textLabel.backgroundColor = [UIColor clearColor]; cell.textLabel.layer.shadowOffset = CGSizeMake(0, 2); cell.textLabel.layer.shadowOpacity = 0.5; return cell; }
看上去是很簡單的cell,下面用 Instruments 測一下FPS:

未優化前的FPS
平均沒有超過40FPS
,是什麼原因呢?
離屏渲染
開啟“離屏渲染”標示:

離屏渲染檢查
可見,透明背景+陰影引發了離屏渲染,去掉後FPS恢復正常,可是這樣又達不到需要的陰影效果,有什麼辦法可以兩全其美呢?
陰影也有高重新整理率
我們可以做如下設定:
cell.layer.shouldRasterize = YES;
當shouldRasterize設成true時,將渲染 光柵化
,即將layer渲染成一個bitmap,並快取起來,等下次使用時直接使用快取,不再重新去渲染,減少了GPU的佔用。
由於bitmap是點陣圖,在螢幕上就會有些失真,會看到毛刺比較明顯:

開啟光柵化後導致失真
需要設定比例值:
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
這樣就可以即保證陰影的渲染效果,又保證了重新整理率。
小提示
有些時候,發生問題的未必是複雜的資料,也有可能是系統機制的原因,因此先通過工具定位問題,再有針對性地進行優化,記住:
提前優化是萬惡之源。