最近時間比較緊尾菇,所以有關(guān)項目中的優(yōu)化,特別是內(nèi)存優(yōu)化,一直沒來得及做好派诬,本來想找一個機會徹底處理好的劳淆,看能只能等下個階段處理好這種問題了。我們開發(fā)產(chǎn)品的時候默赂,會發(fā)現(xiàn)兼容性是一個比較大的問題沛鸵。產(chǎn)品不可能說僅僅兼容最新的設(shè)備,例如iphoneX或者安卓7.0缆八。事實上考慮到很多用戶的實際情況曲掰,很多用戶使用的還是2014年的ipad mini而不是ipad
air。
在此情況之下耀里,我也清楚某些比較old設(shè)備的情況了蜈缤,我們一起看一下各個蘋果設(shè)備的內(nèi)存限制情況:
設(shè)備??????????? ??????????內(nèi)存?????????????????????? 建議內(nèi)存
Ipad mini1??????????????? 512M??????????????????????? 170-180M
Ipad mini2??????????????? 1024M?????????????????????? 320-450M
Ipad1???????????????????? 256M??????????????????????? 40-80M
Ipad2???????????????????? 512M??????????????????????? 170-180M
這里并沒有貼上iphone1,iphone2,iphone3設(shè)備的內(nèi)存以及建議內(nèi)存,畢竟這些設(shè)備的使用量幾乎被后面的iphone6,iphone7,iphone8替代了冯挎,不過ipad mini系列的使用量還是比較大的底哥,即使是2014年,2015年的產(chǎn)品使用量還是有的房官。因為這個問題趾徽,所以項目必須做一次內(nèi)存優(yōu)化。
內(nèi)存優(yōu)化要做的要點有:
第一點:plist圖集文件的集中使用翰守。這里說明的意思是孵奶,圖集資源必須某一個僅僅支持某個UI,而不是說蜡峰,UI加載了該圖集了袁,但是該圖集存在其他的不需要用到的資源。例如a.json湿颅,a.csb,我們用到了a.plist中的50個文件载绿,但是事實上里面有100個小圖組成的大圖,這樣加載到內(nèi)存中的plist以及對應(yīng)的圖集文件油航,消耗了一倍的內(nèi)存崭庸,但是用到的卻不及一半,如此下去內(nèi)存急速增長谊囚,所以設(shè)備會撐不住怕享,直接黑屏。
第二點:緩存的使用镰踏,應(yīng)該謹(jǐn)慎函筋。這次要優(yōu)化的主要也是緩存。緩存使用得好奠伪,那是巧妙驻呐,使用得不好灌诅,內(nèi)存同樣會急劇飆升。我平時有注意到含末,有一些圖集資源是長期加載到內(nèi)存張的猜拾,并沒有釋放。但是即使是這么一點的內(nèi)存不釋放佣盒,引起的后果也是驚人的挎袜,由于其他的圖集渲染很厲害,最后整個消耗的內(nèi)存非常厲害肥惭,于是在比較老的設(shè)備上面出現(xiàn)問題盯仪,所以這也要是要優(yōu)化的方向。那么實際上我們到底應(yīng)不應(yīng)該使用緩存呢蜜葱。
就這一點全景,緩存的使用肯定是有價值的,例如切換紋理牵囤,例如精靈幀的緩存爸黄,又如動畫的緩存,我們使用到這些緩存技術(shù)揭鳞,主要是為了在一些復(fù)用的地方炕贵,又或者數(shù)組的地方,可以實現(xiàn)復(fù)用野崇。最現(xiàn)實的意義是称开,切換紋理,又或者精靈幀的復(fù)用乓梨,可以一次性直接從內(nèi)存中讀取精靈塊鳖轰,而不用一個一個的創(chuàng)建,速度快了很多扶镀,渲染也快了很多蕴侣。可以在一定程度上面降低GPU和CPU的內(nèi)存占用狈惫。當(dāng)然這些是建立在可靠的加載和釋放的情況下睛蛛,如果出現(xiàn)大時間段內(nèi)的不釋放鹦马,那么內(nèi)存出現(xiàn)問題胧谈,也是常見的,所以最后的方案是:按照場景進(jìn)行預(yù)加載需要的緩存荸频,需要的時候菱肖,就使用,不需要的時候旭从,就主動釋放稳强。具體的時機就是:OnEnter進(jìn)行加載场仲,OnExit進(jìn)行釋放掉,這樣就可以實現(xiàn)內(nèi)存的有效管理了退疫。目前項目中渠缕,存在的緩存是一次性加載到內(nèi)存中,考慮到高效性褒繁,所以并沒有按照場景進(jìn)行階段性的釋放和加載亦鳞,這是這次優(yōu)化必須做的。
第三點:要謹(jǐn)慎使用ImageView,精靈棒坏,按鈕燕差。我們知道使用渲染的消耗單位,精靈是1單位坝冕,ImageView是2單位徒探,按鈕則是3單位。不能因為渲染的差距不大喂窟,就可以頻繁使用按鈕或者ImageView,基本上內(nèi)存需求太多就是因為精靈测暗,ImageView以及按鈕的使用不當(dāng)造成的。這個時候谎替,我們可以考慮的方案是偷溺,如果必須要有觸摸效果,我們可以采用代碼實現(xiàn)按鈕的一些效果钱贯,而不是直接去使用按鈕挫掏。多一些渲染單位,對內(nèi)存的需求就增多了秩命,自然也就容易黑屏崩潰了尉共。
第四點:扁平節(jié)點設(shè)計。扁平的節(jié)點設(shè)計弃锐,這個比較重要袄友,我們最好不要建立太多的圖集或者文件的讀取目錄,相反應(yīng)該追求盡可能在一個地方讀取霹菊。雖然管理起來并不方案剧蚣,但是對于渲染而言,速度卻快了很多旋廷!另外一點鸠按,圖集的復(fù)用性,圖片的復(fù)用性饶碘。不要總是把某些類似的圖片或者圖集進(jìn)行重復(fù)的制造輪子目尖。不能因為類似的功能在兩處不同功能的地方,就使用兩次類似的文件扎运,這樣不對瑟曲,不僅加載了內(nèi)存的消耗饮戳,同時也加大了資源的消耗兰珍,造成了資源管理的不方便温治。要盡可能少的進(jìn)行文件讀取,次數(shù)越少越好肥照,減少CPU的文件讀寫操作消耗的內(nèi)存烦衣。在UI設(shè)計設(shè)計方面篮赢,盡可能扁平化,不要設(shè)計太深的節(jié)點琉挖。當(dāng)然這一點我們知道启泣,但是行動起來總是忘記了,其實很多時候還是因為為了追求自認(rèn)為合理的結(jié)構(gòu)示辈,所以就加深了層次結(jié)構(gòu)寥茫,這是要改善的地方。
以上四點是內(nèi)存優(yōu)化過程中的一部分矾麻。第四點則是多個內(nèi)存優(yōu)化的集合纱耻。后面會繼續(xù)講解內(nèi)存優(yōu)化,花較多的篇幅說明內(nèi)存優(yōu)化的過程和詳細(xì)細(xì)節(jié)险耀。