iOS性能優(yōu)化

  • 避免設(shè)置顏色透明度alpha
  • 1秒默認(rèn)刷60幀,每一幀顯示一張圖片
  • 兩幀刷新之間運(yùn)算沒(méi)有做完,就會(huì)卡
  • 一定要用真機(jī)測(cè)試,模擬器的內(nèi)存不真實(shí);越爛的手機(jī)越能測(cè)試性能
  • Profile — core Animation只能在真機(jī)上用

離屏渲染

  1. 圖層在被顯示之前在一個(gè)屏幕外的上下文中渲染
  2. GPU在當(dāng)前屏幕緩沖區(qū)以外新開(kāi)辟一個(gè)緩沖區(qū)進(jìn)行渲染操作
  3. 屏幕外緩沖區(qū)當(dāng)前屏幕緩沖區(qū)上下文切換很耗性能
  4. 性能的代價(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è)離屏渲染

  • InstrumentsCore 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)題了。

問(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)功能


參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在性能優(yōu)化中一個(gè)最具參考價(jià)值的屬性是FPS:Frames Per Second,其實(shí)就是屏幕刷新率,蘋(píng)果的ipho...
    低頭淺笑_保持微笑閱讀 1,460評(píng)論 0 0
  • 1.首先新建項(xiàng)目-打開(kāi)protect-profile 左側(cè) 數(shù)值代表的fpsfps:我們知道任何屏幕總是有一個(gè)刷新...
    那位小姐閱讀 1,945評(píng)論 7 12
  • 1.啟動(dòng)時(shí)間 應(yīng)用啟動(dòng)時(shí)間長(zhǎng)短對(duì)用戶(hù)第一次體驗(yàn)至關(guān)重要,同時(shí)系統(tǒng)對(duì)應(yīng)用的啟動(dòng)、恢復(fù)等狀態(tài)的運(yùn)行時(shí)間也有嚴(yán)格的要求,...
    心至靜行至遠(yuǎn)閱讀 1,635評(píng)論 2 4
  • 前言 工欲善其事,必先利其器。Instrument對(duì)于iOS開(kāi)發(fā)來(lái)說(shuō),是發(fā)現(xiàn)并且解決問(wèn)題的一把利器。 本文會(huì)用到的...
    iOS開(kāi)發(fā)攻城獅閱讀 8,155評(píng)論 1 62
  • 總結(jié)一下平時(shí)優(yōu)化app性能用到的方法 1.合理的分配線(xiàn)程,不要濫用多線(xiàn)程。開(kāi)辟線(xiàn)程,以及線(xiàn)程之間的上下文切換是消耗...
    SpursGo閱讀 1,051評(píng)論 0 2

友情鏈接更多精彩內(nèi)容