繪製陰影引起的 iOS 繪圖性能問題總結

轉自:http://blog.devdlh.com/blog/2013/03/18/performance-problerm-caused-by-shadowpath/

繪製陰影引起的 iOS 繪圖性能問題總結

MAR 18TH, 2013 | COMMENTSios

在 iOS 開發中,經過設置 layer 的 shadowColor、shadowOpacity、shadowOffset、shadowRadius 幾個屬性能夠很方便的爲 UIView 添加陰影效果。可是前段時間碰到一個問題,在添加了陰影后,會出現動畫卡頓的現象。在一番 Google 之後找到了解決方案,須要爲陰影指定路徑,即設置 layer 的 shadowPath 屬性。例如:wordpress

1
view.layer.shadowPath = [UIBezierPath bezierPathWithRect:view.bounds].CGPath;

不指定陰影路徑時,繪製陰影會產生大量的 Offscreen-Rendered 。而 Offscreen-Rendered(離屏渲染)和 Blending(混合)是 iOS 繪圖中對性能影響比較大的兩方面。性能

Offscreen-Rendered

離屏渲染意味着某一區域每幀渲染了兩次。大部分離屏幕渲染由陰影和遮障繪製形成。以陰影繪製爲例例,iOS 會先繪製目標的陰影,而後繪製目標自己。當咱們沒有設置陰影的路徑時,iOS 在每次繪製前會遞歸每一個子層來計算陰影的精確路徑,這是很是消耗性能的,也致使了動畫時出現卡頓。動畫

所以,通常狀況下須要指定陰影的路徑。當 View 的 bound 改變時,從新設置陰影路徑。若是 View 的 bound 作動畫,則須要使用 CAAnimation 爲 shadowPath 設置動畫。spa

參考文檔.net

Blending

iOS 在渲染每一幀時,都將計算每個像素點的顏色。當最上面的層不透明時,只需取最上面的層的顏色。而當上面的層存在透明度時,須要混合每一層的顏色來計算獲得最終顯示的顏色。自上而下有透明度的層越多,計算量越大,這也會致使動畫時性能下降。所以,咱們在開發中,要儘可能減小沒必要要的透明層。code

使用 Instruments 檢測繪圖性能

使用 Instruments 的 Core Animation 模板能夠很方便的檢測應用中的 Blending 和 Offscreen-Rendered 。orm

勾選 Color Offscreen-Rendered Yellow 選項將高亮進行離屏渲染的區域。blog

Offscreen-Rendered 截圖

勾選 Color Blended Layers 將顯示進行圖層混合的區域,顏色越深表示計算量越大。遞歸

Blended Layers 截圖

相關文章
相關標籤/搜索