2012-07-17 30 views
10

我想分享我在UIViews上使用self.layer.shouldRasterize = YES;標誌的經驗。UIView self.layer.shouldRasterize = YES和性能問題

我有了self.layer.shouldRasterize爲了提高滾動性能開啓ON所有的人都靜子視圖是比設備的屏幕大)一UIView類層次結構。

今天在其中一個小類中,我使用CAEmitterLayer來產生很好的粒子效果。

表現真的很差雖然粒子的數量真的是低(50粒)

是什麼這個問題的原因是什麼?

回答

10

關閉self.layer.shouldRasterize將性能提高到正常水平。

這是爲什麼?

根據蘋果開發者網站上的視頻(我不記得視頻,請幫忙嗎?)self.layer.shouldRasterize的規則很簡單:如果你所有的子視圖都是靜態的(它們的位置,內容等等)不改變或動畫),那麼將self.layer.shouldRasterize設爲ON是有益的。另一方面,如果任何子視圖正在改變,那麼框架需要重新緩存視圖層次結構,這是一個巨大的瓶頸。瓶頸之處在於CPU和GPU之間的內存複製。

31

我只是引述蘋果文檔,並解釋:

@property BOOL shouldRasterize 

當此屬性的值是YES,該層是在其本地座標空間呈現爲一個位圖 ,然後合成 到目的地與任何其他內容。濾鏡屬性中的陰影效果和任何 濾鏡都被光柵化幷包含在 位圖中。但是,圖層的當前不透明度未被光柵化。 如果柵格化位圖在合成期間需要縮放,則根據需要應用縮小過濾器和縮放過濾器屬性 中的 過濾器。

所以基本上,當shouldRasterize設置爲YES時,將組成圖層的每個像素進行計算,並將整個圖層緩存爲位圖。

  • 您什麼時候能從中受益?

當你只需要畫一次。這意味着當你只需要純粹的「簡單」動畫(例如移動,變換,縮放...)時,因爲CoreAnimation實際上會使用該層而不會在每一幀重新繪製它。這是一個非常強大的功能來緩存與CoreAnimation相結合的複雜圖層(陰影和角落半徑)。

  • 什麼時候它會殺死你的幀率?

當你的層重新顯示很多次,因爲對已經生效,該shouldRasterize將處理所有像素緩存位圖數據圖中上端。

所以你應該問自己的真正問題是這樣的:「在哪一層我將shouldRasterize應用於YES?此層重新繪製的頻率?

希望這已經夠清楚了。

+1

我是iOS新手。那麼,如果我將它用於自定義UITableViewCells,那麼shouldRasterize = YES會很好嗎?順便謝謝你這個偉大的答案。 :) @apouche – GangstaGraham 2013-05-28 16:30:37

+2

我會說最喜歡沒有,這是不是一個好主意,光柵化UITableViewCell有兩個原因:1.如果您使用重用標識符,tableview單元格將在滾動過程中很多時間重繪(因此shouldRasterize將懲罰它甚至更多)。 2:你不會從中受益,因爲對UITableViewCell進行動畫處理是非常罕見的。 – apouche 2013-05-29 12:37:02

+0

@apouche等待,你是否說要使用shouldRasterize如果你縮放?這不僅會縮放位圖緩存,還會導致看起來醜陋的圖像? (擴大例如?) – 2015-12-08 20:26:45