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