在TableView優(yōu)化檢查清單一篇中,例出了TableView優(yōu)化常見的一些入手點(diǎn),本篇將給出一個(gè)在特定效果下,會影響TableView 刷新效率的一種情形及優(yōu)化方法,在你決定用復(fù)雜方法優(yōu)化TableView時(shí),提前排除這種可能。
簡單的文本也會導(dǎo)致低刷新率
本例中,cell將顯示3000個(gè)數(shù)字:

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:

未優(yōu)化前的FPS
出人意料地低,
平均沒有超過40FPS,是什么原因呢?
離屏渲染
打開“離屏渲染”標(biāo)示:離屏渲染檢查
可見,透明背景+陰影引發(fā)了離屏渲染,去掉后FPS恢復(fù)正常,可是這樣又達(dá)不到需要的陰影效果,有什么辦法可以兩全其美呢?
陰影也有高刷新率
我們可以做如下設(shè)置:
cell.layer.shouldRasterize = YES;
當(dāng)shouldRasterize設(shè)成true時(shí),將渲染光柵化,即將layer渲染成一個(gè)bitmap,并緩存起來,等下次使用時(shí)直接使用緩存,不再重新去渲染,減少了GPU的占用。
由于bitmap是位圖,在屏幕上就會有些失真,會看到毛刺比較明顯:

開啟光柵化后導(dǎo)致失真
需要設(shè)置比例值:
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
這樣就可以即保證陰影的渲染效果,又保證了刷新率。
小提示
有些時(shí)候,發(fā)生問題的未必是復(fù)雜的數(shù)據(jù),也有可能是系統(tǒng)機(jī)制的原因,因此先通過工具定位問題,再有針對性地進(jìn)行優(yōu)化,記?。?/p>
提前優(yōu)化是萬惡之源。