iOS 滑動性能優(yōu)化
一、 減少圖層的Blend操作
展示半透明的view,設(shè)備會把當(dāng)前圖層和背景圖層進(jìn)行alpha疊加,這是一項(xiàng)很耗性能的一件事。如果動畫中每一幀都做疊加,性能的損耗是很嚴(yán)重。
1. UIView的背景色避免使用clearColor
- UIView記得設(shè)置成和SuperView相同的顏色
動作雖小,效果卻好
尤其是在需要滑動的場景
2. 控件貼圖避免使用帶alpha的圖片
- 視覺給出的貼圖最好不帶Alpha通道
- 如果必須使用Alpha,則主動去Alpha,提前和背景色合成為不含Alpha的圖片
針對同一場景圖片合成只需要做一次
一次合成,長期使用
3. UIImageView 使用時(shí)避免半透明
Disable alpha blending except where needed. Unless you are intentionally working with images that contain transparency (drawing UI elements, for example), you should generally mark the view as opaque by checking Opaque checkbox in the attributes inspector, or setting the opaque property on the view itself.
UIImageView的半透明取決于以下幾項(xiàng):
- 顯示的圖片
- View的opaque屬性的值
- View的alpha值
- View的背景色
An opaque view is expected to fill its bounds with entirely opaque content—that is, the content should have an alpha value of 1.0. If the view is opaque and either does not fill its bounds or contains wholly or partially transparent content, the results are unpredictable. You should always set the value of this property to NO if the view is fully or partially transparent.
規(guī)則如下:
-
當(dāng)Opaque屬性為YES的時(shí)候,imageView的alpha屬性會被忽略,圖層是否半透明取決于圖片和imageView本身的背景色的疊加結(jié)果。
-
如果疊加結(jié)果圖全部不透明,則圖層不透明,不會觸發(fā)blend操作。
-
如果疊加結(jié)果中出現(xiàn)半透明區(qū)域,則整個(gè)圖層都會變成不透明,會觸發(fā)blend操作。
-
-
如果Opaque屬性為NO的時(shí)候,圖層是否半透明取決于圖片和imageView的multiplied疊加結(jié)果確定。
簡單理解,如果可能盡量:
- 設(shè)置Opaque為YES
- 背景色設(shè)置為不含alpha的顏色
- alpha值最好也是1(不透明)。
適用場景
- 通用優(yōu)化規(guī)則,不會造成副作用
二、適當(dāng)使用Rasterize
針對內(nèi)容比較固定的Cell,建議采用光柵化,讓Core Animation框架幫我們完成圖層的混合,生成一個(gè)靜態(tài)圖,優(yōu)化幀率。
適用場景
- UITableView & UICollectionView & UIScrollView中內(nèi)容變化不頻繁的Cell
注:此優(yōu)化需要Profile,使用Core Animation工具中的“ColorHitsGreenandMissesRed”工具調(diào)優(yōu)
如果使用不當(dāng),可能適得其反
三、避免圖片資源的重采樣
Image views can perform two operations that are relatively expensive performance-wise: scaling the image and alpha compositing the image with lower layers.
減少圖片資源的重采樣是一個(gè)費(fèi)時(shí)給力的過程,涉及到插值算法,以雙線性插值為例,每插值一個(gè)點(diǎn)需要用到周圍四個(gè)點(diǎn)的像素值,運(yùn)算量可見一斑。
直接對于UIImageView設(shè)置一個(gè)大圖,在實(shí)際展示的時(shí)候會在主線程完成重采樣的過程,耗時(shí)耗內(nèi)存。
如何避免?
-
網(wǎng)絡(luò)圖片資源
- 請求接口時(shí),服務(wù)端根據(jù)場景返回尺寸盡可能接近展示的圖片資源。
此舉既可以節(jié)省流量,又可以節(jié)省重采樣的時(shí)間。
-
本地圖片資源
- 有可能的話,針對不同場景放置多個(gè)尺寸的圖片資源
- 針對應(yīng)用場景生成一個(gè)適用于使用場景尺寸的圖片資源,并在該場景中生成的圖片
適用場景
所有需要使用圖片的場景都可以使用此方案優(yōu)化,無副作用。
總結(jié)
滑動性能優(yōu)化這塊兒涉及到的知識還是挺多的,不要盲目,過早的優(yōu)化。使用Instrument找出瓶頸,然后合理使用不同的方案。性能優(yōu)化有很多奇淫技巧,但通常做到上面幾個(gè)大的點(diǎn),基本上性能就能接受了。
對于TableView & Collection View這塊兒還有一個(gè)很有效的優(yōu)化手段,在快速滑動的時(shí)候,忽略中間快速閃過的Cell,直接借用UIScrollView的delegate判斷加載滑動停止目標(biāo)區(qū)域的Cell的內(nèi)容。實(shí)踐證明此方法效果還是很明顯的,具體例子可以網(wǎng)上搜一下。
Profile -> 優(yōu)化 -> Profile
一直重復(fù)上面的流程,直到達(dá)到預(yù)期為止。
最后重要的事情說三遍:Profile一定請使用真機(jī),最好使用Release模式,以達(dá)到最真實(shí)的效果。 Profile一定請使用真機(jī),最好使用Release模式,以達(dá)到最真實(shí)的效果。 Profile一定請使用真機(jī),最好使用Release模式,以達(dá)到最真實(shí)的效果。
更多參考資料:
- iOS Core Animation: Advanced Techniques
- UIImageView Class Reference
- Image Resizing Techniques
- iOS 保持界面流暢的技巧
- Alpha compositing
注:smileEvday保留本文的一切權(quán)利
轉(zhuǎn)載請著名原文出處
本文所有內(nèi)容僅代表個(gè)人觀點(diǎn),如有有不對的地方,歡迎指出。
??請樓主喝杯豆?jié){??
![]() |

浙公網(wǎng)安備 33010602011771號