- 避免設(shè)置顏色透明度alpha
- 1秒默認(rèn)刷60幀,每一幀顯示一張圖片
- 兩幀刷新之間運算沒有做完,就會卡
- 一定要用真機測試,模擬器的內(nèi)存不真實;越爛的手機越能測試性能
-
Profile — core Animation只能在真機上用
離屏渲染
- 圖層在被顯示之前在一個
屏幕外的上下文中渲染 - GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作
-
屏幕外緩沖區(qū)跟當(dāng)前屏幕緩沖區(qū)上下文切換很耗性能 - 性能的代價會直接表現(xiàn)在用戶體驗上
掉幀。
圖層屬性的混合體被指定為在未預(yù)合成之前,不能直接在屏幕中繪制,所以就需要屏幕外渲染被喚起。
- 圖層的以下屬性將會觸發(fā)屏幕外繪制:
- 圓角(當(dāng)和maskToBounds一起使用時)
- 圖層蒙板
- 陰影
- 光柵化(shouldRasterize)
- 抗鋸齒(antialiasing)
shouldRasterize光柵化
將圖轉(zhuǎn)化為一個個柵格組成的圖象。
有時候我們可以把那些需要屏幕外繪制的圖層開啟光柵化以作為一個優(yōu)化方式,前提是這些圖層并不會被頻繁地重繪。
對于那些需要動畫而且要在屏幕外渲染的圖層來說,你可以用CAShapeLayer,contentsCenter或者shadowPath來獲得同樣的表現(xiàn)而且較少地影響到性能。
光柵化特點:每個元素對應(yīng)幀緩沖區(qū)中的一像素。shouldRasterize = YES在其他屬性觸發(fā)離屏渲染的同時,會將光柵化后的內(nèi)容緩存起來,如果對應(yīng)的layer及其sublayers沒有發(fā)生改變,在下一幀的時候可以直接復(fù)用。shouldRasterize = YES,這將隱式的創(chuàng)建一個位圖,各種陰影遮罩等效果也會保存到位圖中并緩存起來,從而減少渲染的頻度(不是矢量圖)。相當(dāng)于光柵化是把GPU的操作轉(zhuǎn)到CPU上了,生成位圖緩存,直接讀取復(fù)用。當(dāng)你使用光柵化時,你可以開啟“Color Hits Green and Misses Red”來檢查該場景下光柵化操作是否是一個好的選擇。綠色表示緩存被復(fù)用,紅色表示緩存在被重復(fù)創(chuàng)建。如果光柵化的層變紅得太頻繁那么光柵化對優(yōu)化可能沒有多少用處。位圖緩存從內(nèi)存中刪除又重新創(chuàng)建得太過頻繁,紅色表明緩存重建得太遲??梢葬槍π缘倪x擇某個較小而較深的層結(jié)構(gòu)進行光柵化,來嘗試減少渲染時間。
模擬器的Debug
-
Color Blended Layers(混合圖層)- 當(dāng)前像素點上的多層layer共同決定
- 盡量避免設(shè)置alpha,這樣GPU會忽略下面所有的layer,節(jié)約計算量
-
Color Copied Images- 和開發(fā)沒關(guān)系,設(shè)計師給的圖片不是32bit格式
-
Color Misaligned Images- 像素對齊
- frame和圖片size不匹配,會觸發(fā)反鋸齒計算
-
Color Offscreen-Rendered(離屏渲染)- 重寫drawRect方法
- masksToBounds
- 其他一些手動觸發(fā)離屏渲染的動作
Instruments監(jiān)測離屏渲染
-
Instruments的Core Animation工具中有幾個和離屏渲染相關(guān)的檢查選項:-
Color Offscreen-Rendered Yellow- 開啟后會把那些需要離屏渲染的圖層高亮成黃色,這就意味著黃色圖層可能存在性能問題。
-
Color Hits Green and Misses Red- 如果shouldRasterize被設(shè)置成
YES,對應(yīng)的渲染結(jié)果會被緩存,如果圖層是綠色,就表示這些緩存被復(fù)用;如果是紅色就表示緩存會被重復(fù)創(chuàng)建,這就表示該處存在性能問題了。
- 如果shouldRasterize被設(shè)置成
-
問答
Q:離屏渲染 我覺得很難做到(對于需要'CG'畫出來的東西?。┪揖拖胫?用drawRect方法是不是應(yīng)該適當(dāng)使用而不是完全禁止
A:任何優(yōu)化只是針對可以優(yōu)化的地方 優(yōu)化的前提是實現(xiàn)功能