容易忽視的性能殺手:TableView刷新優(yōu)化特例

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)化是萬惡之源。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容