標籤:
iOS 滑動效能最佳化
目錄
- 一、 減少圖層的Blend操作
- 1. UIView的背景色避免使用clearColor
- 2. 控制項貼圖避免使用帶alpha的圖片
- 3. UIImageView 使用時避免半透明
- 二、適當使用Rasterize
- 三、避免圖片資源的重採樣
- 總結
- 更多參考資料
一、 減少圖層的Blend操作
展示半透明的view,裝置會把當前圖層和背景圖層進行alpha疊加,這是一項很耗效能的一件事。如果動畫中每一幀都做疊加,效能的損耗是很嚴重。
1. UIView的背景色避免使用clearColor
- UIView記得設定成和SuperView相同的顏色
動作雖小,效果卻好
尤其是在需要滑動的情境
2. 控制項貼圖避免使用帶alpha的圖片
- 視覺給出的貼圖最好不帶Alpha通道
- 如果必須使用Alpha,則主動去Alpha,提前和背景色合成為不含Alpha的圖片
針對同一情境圖片合成只需要做一次
一次合成,長期使用
3. UIImageView 使用時避免半透明
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的半透明取決於以下幾項:
- 顯示的圖片
- 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.
規則如下:
簡單理解,如果可能盡量:
- 設定Opaque為YES
- 背景色設定為不含alpha的顏色
- alpha值最好也是1(不透明)。
適用情境
二、適當使用Rasterize
針對內容比較固定的Cell,建議採用光柵化,讓Core Animation架構幫我們完成圖層的混合,產生一個靜態圖,最佳化幀率。
適用情境
- UITableView & UICollectionView & UIScrollView中內容變化不頻繁的Cell
註:此最佳化需要Profile,使用Core Animation工具中的“ColorHitsGreenandMissesRed”工具調優
如果使用不當,可能適得其反
三、避免圖片資源的重採樣
Image views can perform two operations that are relatively expensive performance-wise: scaling the image and alpha compositing the image with lower layers.
減少圖片資源的重採樣是一個費時給力的過程,涉及到插值演算法,以雙線性插值為例,每插值一個點需要用到周圍四個點的像素值,運算量可見一斑。
直接對於UIImageView設定一個大圖,在實際展示的時候會在主線程完成重採樣的過程,耗時耗記憶體。
如何避免?
網狀圖片資源
- 請求介面時,服務端根據情境返回尺寸儘可能接近展示的圖片資源。
此舉既可以節省流量,又可以節省重採樣的時間。
本地圖片資源
- 有可能的話,針對不同情境放置多個尺寸的圖片資源
- 針對應用情境產生一個適用於使用情境尺寸的圖片資源,並在該情境中產生的圖片
適用情境
所有需要使用圖片的情境都可以使用此方案最佳化,無副作用。
總結
滑動效能最佳化這塊兒涉及到的知識還是挺多的,不要盲目,過早的最佳化。使用Instrument找出瓶頸,然後合理使用不同的方案。效能最佳化有很多奇淫技巧,但通常做到上面幾個大的點,基本上效能就能接受了。
對於TableView & Collection View這塊兒還有一個很有效最佳化手段,在快速滑動的時候,忽略中間快速閃過的Cell,直接借用UIScrollView的delegate判斷載入滑動停止目的地區域的Cell的內容。實踐證明此方法效果還是很明顯的,具體例子可以網上搜一下。
Profile -> 最佳化 -> Profile
一直重複上面的流程,直到達到預期為止。
最後重要的事情說三遍:
Profile一定請使用真機,最好使用Release模式,以達到最真實的效果。
Profile一定請使用真機,最好使用Release模式,以達到最真實的效果。
Profile一定請使用真機,最好使用Release模式,以達到最真實的效果。更多參考資料:
- iOS Core Animation: Advanced Techniques
- UIImageView Class Reference
- Image Resizing Techniques
- iOS 保持介面流暢的技巧
- Alpha compositing
註:smileEvday保留本文的一切權利
轉載請著名原文出處
本文所有內容僅代表個人觀點,如有有不對的地方,歡迎指出。
iOS 滑動效能最佳化