很多尚未成熟的App都會(huì)存在很多問題,如卡頓、耗電浆洗、內(nèi)存管理等等吼野,包括我們項(xiàng)目App。今天有空閑時(shí)間岸售,就決定對(duì)部分性能進(jìn)行優(yōu)化,當(dāng)然工具主要就是用Xcode自帶的Core Animation了。話不多說胁后,開干。
Core Animation啟動(dòng)運(yùn)行
打開Xcode對(duì)當(dāng)前項(xiàng)目Profile嗦枢,點(diǎn)擊Product再點(diǎn)擊Profile
這時(shí)就會(huì)打開 Profiling Template 選項(xiàng)對(duì)話框:
選擇Core Animation即可
點(diǎn)擊紅色運(yùn)行按鈕啟動(dòng)App攀芯,隨后操作App就能看到FPS和CPU等性能信息了
但是你看到這些信息了,發(fā)現(xiàn)了問題文虏,該如何優(yōu)化呢侣诺,下面就用Core Animation來一個(gè)個(gè)優(yōu)化
在右下角面板的 Display Settings 區(qū)域,我們可以看到多個(gè) Debug Options
接下來一個(gè)一個(gè)看氧秘。
Color Blended Layers
這個(gè)選項(xiàng)選項(xiàng)基于渲染程度對(duì)屏幕中的混合區(qū)域進(jìn)行綠到紅的高亮顯示年鸳,越紅表示性能越差,會(huì)對(duì)幀率等指標(biāo)造成較大的影響丸相。紅色通常是由于多個(gè)半透明圖層疊加引搔确,而且無用的圖層疊加越多,顏色越紅。所以對(duì)這個(gè)做性能優(yōu)化就是盡量保證圖層疊加少膳算,并盡量減少對(duì)透明度的使用座硕。下面就是優(yōu)化后的App界面與微信朋友圈的對(duì)比,可以看出這個(gè)性能比微信還更勝一籌涕蜂。
Color Hits Green and Misses Red
當(dāng) UIView.layer.shouldRasterize = YES 時(shí)华匾,耗時(shí)的圖片繪制會(huì)被緩存,并當(dāng)做一個(gè)簡(jiǎn)單的扁平圖片來呈現(xiàn)机隙。這時(shí)候蜘拉,如果頁面的其他區(qū)塊(比如 UITableViewCell 的復(fù)用)使用緩存直接命中,就顯示綠色有鹿,反之旭旭,如果不命中,這時(shí)就顯示紅色葱跋。紅色越多您机,性能越差。因?yàn)闁鸥窕删彺娴倪^程是有開銷的年局,如果緩存能被大量命中和有效使用际看,則總體上會(huì)降低開銷,反之則意味著要頻繁生成新的緩存矢否,這會(huì)讓性能問題雪上加霜仲闽。
所以這里的這個(gè)緩存就需要慎重使用,而我們App包括微信QQ支付寶等我看也基本沒有使用這個(gè)方式僵朗。而我們App的statusBar會(huì)經(jīng)常閃紅色赖欣,這是因?yàn)槲沂褂昧艘粋€(gè)CPU和FPS的實(shí)時(shí)查看工具,需要經(jīng)常刷新顯示验庙,所以就沒啥解決的顶吮。
Color Copied Images
對(duì)于 GPU 不支持的色彩格式的圖片只能由 CPU 來處理,把這樣的圖片標(biāo)為藍(lán)色粪薛。藍(lán)色越多悴了,性能越差。因?yàn)槲ナ伲覀儾幌M跐L動(dòng)視圖的時(shí)候湃交,由 CPU 來處理圖片,這樣可能會(huì)對(duì)主線程造成阻塞藤巢「爿海看了App好幾個(gè)頁面,發(fā)現(xiàn)根本不會(huì)出現(xiàn)這里所說的藍(lán)色掂咒,但我查看支付寶QQ就發(fā)現(xiàn)了幾個(gè)藍(lán)色的地方才沧,不知道是他們有特殊的考慮還是沒發(fā)現(xiàn)這問題迈喉,但問題也特少,影響不大温圆。圖就不上了
Color Non-Standard Surface Formats
這個(gè)性能發(fā)現(xiàn)基本上沒有資料能查到弊添,打開這個(gè)性能檢測(cè)后,發(fā)現(xiàn)App上很多淺灰色色塊捌木,并且有個(gè)規(guī)律,它們都是沒有設(shè)置背景色的區(qū)域嫉戚,后來自己設(shè)置了背景色就沒有色塊了刨裆,但我不知道是前者還是后者性能好,希望知道的人解答一下彬檀。但我發(fā)現(xiàn)QQ支付寶這些大型的App也沒有對(duì)這些做處理帆啃,而且發(fā)現(xiàn)蘋果原生界面也有很多這種灰色色塊,所以我也沒有對(duì)當(dāng)前App的這些問題做處理窍帝,上一組圖看看效果努潘。
Color Immediately
通常 Core Animation Instruments 以每毫秒 10 次的頻率更新圖層調(diào)試顏色。對(duì)某些效果來說坤学,這顯然太慢了疯坤。這個(gè)選項(xiàng)就可以用來設(shè)置每幀都更新(可能會(huì)影響到渲染性能,而且會(huì)導(dǎo)致幀率測(cè)量不準(zhǔn)深浮,所以不要一直都設(shè)置它)压怠。這是一個(gè)輔助調(diào)試工具,本身是沒有啥效果的飞苇,需要聯(lián)合其他調(diào)試類別菌瘫。
Color Misaligned Images
這個(gè)選項(xiàng)檢查了圖片是否被縮放,以及像素是否對(duì)齊布卡。被放縮的圖片會(huì)被標(biāo)記為黃色雨让,像素不對(duì)齊則會(huì)標(biāo)注為紫色。黃色忿等、紫色越多栖忠,性能越差。主要是將控件按照?qǐng)D片大小來設(shè)定大小贸街,如點(diǎn)贊娃闲、評(píng)論、分割線和聊天按鈕匾浪,還有就是頭像圖片在下載的時(shí)候就從cdn下載自己需要的大小皇帮,這樣圖片的黃色縮放問題就沒了;再就是控件的寬高最好是整數(shù),因?yàn)樘O果的屏幕最小單位是1像素蛋辈,如果有小數(shù)了属拾,設(shè)備顯示就會(huì)多次再計(jì)算将谊,再選擇一個(gè)整數(shù)像素來顯示。而單張大圖由于需求原因渐白,暫時(shí)沒有做處理尊浓。下面就是前后對(duì)比圖:
Color Offscreen-Rendered Yellow
這個(gè)選項(xiàng)會(huì)把那些離屏渲染的圖層顯示為黃色。黃色越多纯衍,性能越差栋齿。這些顯示為黃色的圖層很可能需要用 shadowPath 或者 shouldRasterize 來優(yōu)化。這里只需要少使用圖層的clipsToBounds和layer層的masksToBounds方法即可襟诸。
color compositing fast-path blue
官方說明:“Places a blue overlay over content that is detached from the compositor.”標(biāo)記由硬件繪制的路徑為藍(lán)色瓦堵,藍(lán)色越多越好,可以對(duì)直接使用OpenGL繪制的圖層進(jìn)行高亮歌亲。對(duì)OpenGL沒什么研究菇用,所以這里沒辦法給出方法,大家只需要記住藍(lán)色越多越好就ok陷揪。
Flash Updated Regions
這個(gè)選項(xiàng)會(huì)把重繪的內(nèi)容顯示為黃色惋鸥。不該出現(xiàn)的黃色越多,性能越差悍缠。通常我們希望只是更新的部分被標(biāo)記完黃色卦绣。當(dāng)你滑動(dòng)app視圖的時(shí)候屏幕就是黃色的,建議大家少用這個(gè)調(diào)試飞蚓,因?yàn)椤?gt;閃得眼睛疼迎卤!
我們也可以使用OpenGL ES Analysis
來監(jiān)測(cè)圖形的相關(guān)性能。謝謝支持玷坠!