2011-10-21 39 views
12

核心動畫中的混合和屏外渲染都很昂貴。Blending V.S.屏外渲染,這對Core Animation性能來說更糟糕?

人們可以看到他們在儀器的Core Animation儀器,用調試選項: Instruments

這裏是我的情況:

顯示屏上的UIImageViews的50x50 PNG圖像。我想用6點核心半徑來圓化圖像。第一種方法是設置導致離屏渲染的UIImageView.layer的cornerRadius和masksToBounds。第二種方法是製作具有透明角的PNG圖像副本,這會導致混合(因爲alpha通道)。

我已經嘗試了兩種方法,但我看不到明顯的性能差異。但是,我仍然想知道哪些理論和最佳實踐中哪一個更糟。

非常感謝!

回答

8

好吧,簡短的回答,混合必須發生任何一種方式來正確顯示透明的角落像素。但是,如果您希望生成的視圖也以某種方式製作動畫(並且記住,滾動是最常見的動畫類型),通常這應該只是一個問題。此外,當我的視圖變得複雜時,我能夠重新創建「cornerRadius」會導致舊設備(我的情況爲iPhone 3G)渲染錯誤的情況。對於需要高性能動畫的情況,以下是我所遵循的建議。首先,如果您只需要具有圓角的單曲線的資源(只要所需的曲率相同,則不同的比例很好),請將它們保存以避免額外計算「cornerRadius」在運行時。其次,不要在任何不需要它的地方使用透明度(例如當背景實際上是純色時),並且總是爲「不透明」屬性指定正確的值以幫助系統更有效地計算畫畫。

三,想辦法儘量減少透明視圖的大小。例如,對於具有透明元素(例如圓角)的大型邊框視圖,考慮將視圖分成3個(頂部,中部,底部)或7個(4個角,頂部中間,中間,底部中間)部分,保留透明部分儘可能小,並將矩形部分標記爲不透明,背景堅實。第四,在scrollViews中繪製大量文本的情況下(例如高度自定義的UITableViewCell),請考慮使用「drawRect:」方法來更高效地渲染這些部分。繼續使用圖像元素的子視圖,以便在繪製前(子視圖)和「即時」繪圖(繪製圖形:)之間在整個視圖之間分割繪製時間。顯然,實驗(滾動時每秒的幀數)可能表明,違反這種「經驗法則」對於您的特定視圖可能是最佳的。

最後,確保您有足夠的時間來使用分析工具(尤其是CoreAnimation)進行實驗。我發現使用最想要的最慢設備進行改進是最容易的,而在較新設備上的結果看起來很棒。

4

看完WWDC視頻並用Xcode和Instruments進行了一些實驗後,我可以說混合比離屏渲染更好。混合意味着系統需要一些額外的時間來計算透明圖層上的像素的顏色。您擁有的透明度越高(這些圖層的尺寸越大),混合就需要更多時間。

離屏渲染意味着系統將進行多次渲染迭代。在第一次迭代時,系統將使渲染不帶可視化,只是爲了計算應該渲染的區域的邊界和形狀。在下一次迭代中,系統會進行定期渲染(取決於計算的形狀),如果需要的話包括混合

也適用於離屏渲染系統創建一個單獨的圖形上下文並在渲染後破壞它。

所以你應該避免離屏渲染,最好用混合替換它。

相關問題