列表的性能優(yōu)化-圖片性能

流暢的視覺:就是如絲般順滑

不流暢視覺:”卡頓”,”抖動(dòng)”,”遲頓感”

「幀率」Frames per Second(每秒幀數(shù))這個(gè)指標(biāo) 可以通過Instruments 工具中的 Core Animation來觀察.(xCode -> Tools -> Instrument 或者commod + i 快捷鍵)

fps的值越大越好,當(dāng)fps<=45就沒明顯的不流暢了,60以上肉眼察覺不到卡頓。

1: commod + i 打開instruments后,選擇Core Animation選項(xiàng)。

2: 選擇正確的設(shè)備(真機(jī))和應(yīng)用程序。

3: 點(diǎn)擊instruments上紅色開始按鈕,然后滑動(dòng)頁面,在滑動(dòng)屏幕時(shí),幀率越高表示性能越好,幀率過低則意味著屏幕可能會(huì)出現(xiàn)卡頓。觀察如圖:

圖片性能

在右下角面板的 Display Settings 區(qū)域,我們可以看到多個(gè) Debug Options:

Color Blended Layers

這個(gè)選項(xiàng)選項(xiàng)基于渲染程度對(duì)屏幕中的混合區(qū)域進(jìn)行綠到紅的高亮顯示,越紅表示性能越差,會(huì)對(duì)幀率等指標(biāo)造成較大的影響。紅色通常是由于多個(gè)半透明圖層疊加引起。

Color Hits Green and Misses Red

當(dāng) UIView.layer.shouldRasterize = YES時(shí),耗時(shí)的圖片繪制會(huì)被緩存,并當(dāng)做一個(gè)簡(jiǎn)單的扁平圖片來呈現(xiàn)。這時(shí)候,如果頁面的其他區(qū)塊(比如 UITableViewCell 的復(fù)用)使用緩存直接命中,就顯示綠色,反之,如果不命中,這時(shí)就顯示紅色。紅色越多,性能越差。因?yàn)闁鸥窕删彺娴倪^程是有開銷的,如果緩存能被大量命中和有效使用,則總體上會(huì)降低開銷,反之則意味著要頻繁生成新的緩存,這會(huì)讓性能問題雪上加霜,所以我們可以適當(dāng)光柵化來優(yōu)化圖片性能,但是前提是這些圖片變化不大,可以緩存的情況下。

Color Copied Images

對(duì)于 GPU 不支持的色彩格式的圖片只能由 CPU 來處理,把這樣的圖片標(biāo)為藍(lán)色。藍(lán)色越多,性能越差。因?yàn)?,我們不希望在滾動(dòng)視圖的時(shí)候,由 CPU 來處理圖片,這樣可能會(huì)對(duì)主線程造成阻塞。

Color Immediately

通常 Core Animation Instruments 以每毫秒 10 次的頻率更新圖層調(diào)試顏色。對(duì)某些效果來說,這顯然太慢了。這個(gè)選項(xiàng)就可以用來設(shè)置每幀都更新(可能會(huì)影響到渲染性能,而且會(huì)導(dǎo)致幀率測(cè)量不準(zhǔn),所以不要一直都設(shè)置它)。

Color Misaligned Images

這個(gè)選項(xiàng)檢查了圖片是否被縮放,以及像素是否對(duì)齊。被放縮的圖片會(huì)被標(biāo)記為黃色,像素不對(duì)齊則會(huì)標(biāo)注為紫色。黃色、紫色越多,性能越差。

Color Offscreen-Rendered Yellow

在設(shè)置 .layer.masksToBounds = YES;?時(shí)會(huì)產(chǎn)生離屏渲染。這個(gè)選項(xiàng)會(huì)把那些離屏渲染的圖層顯示為黃色。黃色越多,性能越差。這些顯示為黃色的圖層很可能需要用 shadowPath 或者 shouldRasterize 來優(yōu)化。

Color OpenGL Fast Path Blue

這個(gè)選項(xiàng)會(huì)把任何直接使用 OpenGL 繪制的圖層顯示為藍(lán)色。藍(lán)色越多,性能越好。如果僅僅使用 UIKit 或者 Core Animation 的 API,那么不會(huì)有任何效果。如果使用 GLKView 或者 CAEAGLLayer,那如果不顯示藍(lán)色塊的話就意味著你正在強(qiáng)制 CPU 渲染額外的紋理,而不是繪制到屏幕。

Flash Updated Regions

這個(gè)選項(xiàng)會(huì)把重繪的內(nèi)容顯示為黃色。不該出現(xiàn)的黃色越多,性能越差。通常我們希望只是更新的部分被標(biāo)記完黃色。


影響列表性能的圖片處理方式:

1: 縮略圖 和 原圖。

2: 滾動(dòng)頁面多view情況下,圓角的處理。

一般情況下我們會(huì)這樣做: .layer.masksToBounds = YES; .layer.cornerRadius = 2;?

masksToBounds 會(huì)導(dǎo)致拖慢幀率的原因其實(shí)都是Off-Screen Rendering(離屏渲染).

離屏渲染:是指CPU在當(dāng)前屏幕緩沖區(qū)以外再開辟一個(gè)新的緩沖區(qū)進(jìn)行渲染操作.

離屏渲染是一個(gè)很好優(yōu)化性能的方式,但是頻繁發(fā)生離屏渲染(滾動(dòng)屏幕 就會(huì)很頻繁啊)是非常耗時(shí)的。如果是一個(gè)圓角幾乎不會(huì)對(duì)幀率有太大影響,關(guān)鍵數(shù)量要是好多個(gè).通過上面的定義可以看出”離屏渲染”關(guān)鍵不是渲染 而是 離屏.

離屏代價(jià):主要是創(chuàng)建緩沖區(qū)和上下文切換的原因。創(chuàng)建新的緩沖區(qū)代價(jià)都不算大,付出最大代價(jià)的是上下文切換!

關(guān)于上下文切換:?上下文切換在哪都是一個(gè)相當(dāng)耗費(fèi)時(shí)間的操作,不論是 CPU渲染或是進(jìn)程切換.其過程:

(1)我們要保證當(dāng)前屏幕渲染環(huán)境

(2)切換到一個(gè)新的繪制環(huán)境—>申請(qǐng)繪制資源—>初始化環(huán)境—>開始繪制—>繪制結(jié)束—>銷毀繪制環(huán)境

(3)回到主屏幕呈現(xiàn) 或者 再開辟一個(gè)新的離屏渲染重復(fù)(2)

(1)非要作死使用layer.cornerRadius,記得還要添加下面方法

.layer.shouldRasterize = YES;//這樣大部分情況下可以馬上挽救你的幀數(shù)在55幀每秒以上。shouldRasterize = YES會(huì)使視圖渲染內(nèi)容被緩存起來,下次繪制的時(shí)候可以直接顯示緩存,當(dāng)然要在視圖內(nèi)容不改變的情況下。(具體解釋? layer的頭文件,進(jìn)入查看這個(gè)屬性的英文說明? 不覺明厲)

.layer.rasterizationScale = [UIScreen mainScreen].scale;//需要適當(dāng)設(shè)置"抗鋸齒" ?否則在retina的設(shè)備上這些視圖會(huì)出現(xiàn)鋸齒狀。(具體了解參看 layer 屬性)

(2)如果可以用切圖遮罩代替的話 會(huì)效率很高

(3)預(yù)先緩存住 圓角的圖片(預(yù)處理圓角圖片在后臺(tái)處理,處理完畢后緩存起來,再在主線程顯示),來避免了離屏渲染

http://www.cnblogs.com/ioriwellings/p/5011993.html

https://www.zhihu.com/question/20382396

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

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

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