在TableView優(yōu)化檢查清單一篇中,例出了TableView優(yōu)化常見的一些入手點(diǎn)檩赢,本篇將給出一個(gè)在特定效果下吕嘀,會(huì)影響TableView 刷新效率的一種情形及優(yōu)化方法,在你決定用復(fù)雜方法優(yōu)化TableView時(shí)贞瞒,提前排除這種可能偶房。
簡(jiǎn)單的文本也會(huì)導(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;
}
看上去是很簡(jiǎn)單的cell军浆,下面用 Instruments 測(cè)一下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是位圖钢猛,在屏幕上就會(huì)有些失真,會(huì)看到毛刺比較明顯:
開啟光柵化后導(dǎo)致失真
需要設(shè)置比例值:
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
這樣就可以即保證陰影的渲染效果轩缤,又保證了刷新率。
小提示
有些時(shí)候贩绕,發(fā)生問題的未必是復(fù)雜的數(shù)據(jù)火的,也有可能是系統(tǒng)機(jī)制的原因,因此先通過工具定位問題淑倾,再有針對(duì)性地進(jìn)行優(yōu)化馏鹤,記住:
提前優(yōu)化是萬惡之源娇哆。