2012-06-15 78 views
9

我有UIScrollView和UIImageViews裏面的對象數量(UIView組合)。一些UIImageViews有圓形邊框(我使用myImageView.layer.masksToBounds = YES;)。其他有矩形邊框和部分圖像(我使用Interface Builder中的Clip subviews屬性)。clipToBounds和masksToBounds性能問題

的問題是,我發現,剪輯屬性強烈地影響性能的同時,滾動:

對於iPod touch(第4代)分析的結果:

  • 啓用剪輯屬性(兩個或一個他們)我有大約30 fps的同時滾動
  • 殘疾剪輯屬性我都60幀,同時滾動

我真的需要剪切一些圖像以將邊界和其他邊界限制到矩形邊界(以顯示圖像的一部分)。所以,這是我的問題:有什麼方法可以提高性能?可能是有低級別的方法來做到這一點(drawRect:或其他),或者可能會發揮阿爾法遮罩或我只是做錯了什麼?

回答

30

當你有圖形密集型口罩和事情,一個簡單易用的方式來提高性能(很多時候大大)是設置shouldRasterizeYES該項目的層上:

#import <QuartzCore/QuartzCore.h> 

// ... 

view.layer.shouldRasterize = YES; 

這將rastersize的查看緩衝區,所以它不會經常重新渲染。這將爲每個視圖佔用額外的內存,因此您應該在滾動時真正嘗試並回收/重用視圖,這與表視圖的操作方式類似。

視網膜顯示屏你還需要設置rasterizationScale一個合適的值上正確的行爲:

view.layer.rasterizationScale = view.window.screen.scale; // or [UIScreen mainScreen] 

我已經受夠了這種巨大的成功對於像滾動的照片畫廊,每個項目都圓角,陰影等

+0

不錯的建議!但是現在當我將這個屬性應用於整個視圖時(這裏有圓形的圖像視圖和文本標籤),它確實有幫助。在這種情況下,文字變得非常醜陋。如果我僅將它應用於圓形圖像視圖上,它幾乎沒有效果。 – Lloyd18

+1

啊,對不起。對於視網膜支持,設置'view.layer.rasterizationScale = [[UIScreen mainScreen] scale]'。這應該使一切都變得清晰。我已經更新了我的答案。 –

+0

並記住檢查你的內存使用情況。使用「活動監視器」工具查看使用光柵化時的內存使用差異。額外的視頻內存可能不會顯示在分配中。如果增加太多,你應該像我說的那樣嘗試和回收視圖,這樣在任何時候都不會有太多的實例。 –