有關(guān)項(xiàng)目的內(nèi)存優(yōu)化(1)

最近時(shí)間比較緊,所以有關(guān)項(xiàng)目中的優(yōu)化,特別是內(nèi)存優(yōu)化,一直沒來得及做好,本來想找一個(gè)機(jī)會(huì)徹底處理好的,看能只能等下個(gè)階段處理好這種問題了。我們開發(fā)產(chǎn)品的時(shí)候,會(huì)發(fā)現(xiàn)兼容性是一個(gè)比較大的問題。產(chǎn)品不可能說僅僅兼容最新的設(shè)備,例如iphoneX或者安卓7.0。事實(shí)上考慮到很多用戶的實(shí)際情況,很多用戶使用的還是2014年的ipad mini而不是ipad

air。


在此情況之下,我也清楚某些比較old設(shè)備的情況了,我們一起看一下各個(gè)蘋果設(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)品使用量還是有的。因?yàn)檫@個(gè)問題,所以項(xiàng)目必須做一次內(nèi)存優(yōu)化。


內(nèi)存優(yōu)化要做的要點(diǎn)有:


第一點(diǎn):plist圖集文件的集中使用。這里說明的意思是,圖集資源必須某一個(gè)僅僅支持某個(gè)UI,而不是說,UI加載了該圖集,但是該圖集存在其他的不需要用到的資源。例如a.json,a.csb,我們用到了a.plist中的50個(gè)文件,但是事實(shí)上里面有100個(gè)小圖組成的大圖,這樣加載到內(nèi)存中的plist以及對應(yīng)的圖集文件,消耗了一倍的內(nèi)存,但是用到的卻不及一半,如此下去內(nèi)存急速增長,所以設(shè)備會(huì)撐不住,直接黑屏。


第二點(diǎn):緩存的使用,應(yīng)該謹(jǐn)慎。這次要優(yōu)化的主要也是緩存。緩存使用得好,那是巧妙,使用得不好,內(nèi)存同樣會(huì)急劇飆升。我平時(shí)有注意到,有一些圖集資源是長期加載到內(nèi)存張的,并沒有釋放。但是即使是這么一點(diǎn)的內(nèi)存不釋放,引起的后果也是驚人的,由于其他的圖集渲染很厲害,最后整個(gè)消耗的內(nèi)存非常厲害,于是在比較老的設(shè)備上面出現(xiàn)問題,所以這也要是要優(yōu)化的方向。那么實(shí)際上我們到底應(yīng)不應(yīng)該使用緩存呢。


就這一點(diǎn),緩存的使用肯定是有價(jià)值的,例如切換紋理,例如精靈幀的緩存,又如動(dòng)畫的緩存,我們使用到這些緩存技術(shù),主要是為了在一些復(fù)用的地方,又或者數(shù)組的地方,可以實(shí)現(xiàn)復(fù)用。最現(xiàn)實(shí)的意義是,切換紋理,又或者精靈幀的復(fù)用,可以一次性直接從內(nèi)存中讀取精靈塊,而不用一個(gè)一個(gè)的創(chuàng)建,速度快了很多,渲染也快了很多。可以在一定程度上面降低GPU和CPU的內(nèi)存占用。當(dāng)然這些是建立在可靠的加載和釋放的情況下,如果出現(xiàn)大時(shí)間段內(nèi)的不釋放,那么內(nèi)存出現(xiàn)問題,也是常見的,所以最后的方案是:按照場景進(jìn)行預(yù)加載需要的緩存,需要的時(shí)候,就使用,不需要的時(shí)候,就主動(dòng)釋放。具體的時(shí)機(jī)就是:OnEnter進(jìn)行加載,OnExit進(jìn)行釋放掉,這樣就可以實(shí)現(xiàn)內(nèi)存的有效管理了。目前項(xiàng)目中,存在的緩存是一次性加載到內(nèi)存中,考慮到高效性,所以并沒有按照場景進(jìn)行階段性的釋放和加載,這是這次優(yōu)化必須做的。


第三點(diǎn):要謹(jǐn)慎使用ImageView,精靈,按鈕。我們知道使用渲染的消耗單位,精靈是1單位,ImageView是2單位,按鈕則是3單位。不能因?yàn)殇秩镜牟罹嗖淮?,就可以頻繁使用按鈕或者ImageView,基本上內(nèi)存需求太多就是因?yàn)榫`,ImageView以及按鈕的使用不當(dāng)造成的。這個(gè)時(shí)候,我們可以考慮的方案是,如果必須要有觸摸效果,我們可以采用代碼實(shí)現(xiàn)按鈕的一些效果,而不是直接去使用按鈕。多一些渲染單位,對內(nèi)存的需求就增多了,自然也就容易黑屏崩潰了。


第四點(diǎn):扁平節(jié)點(diǎn)設(shè)計(jì)。扁平的節(jié)點(diǎn)設(shè)計(jì),這個(gè)比較重要,我們最好不要建立太多的圖集或者文件的讀取目錄,相反應(yīng)該追求盡可能在一個(gè)地方讀取。雖然管理起來并不方案,但是對于渲染而言,速度卻快了很多!另外一點(diǎn),圖集的復(fù)用性,圖片的復(fù)用性。不要總是把某些類似的圖片或者圖集進(jìn)行重復(fù)的制造輪子。不能因?yàn)轭愃频墓δ茉趦商幉煌δ艿牡胤?,就使用兩次類似的文件,這樣不對,不僅加載了內(nèi)存的消耗,同時(shí)也加大了資源的消耗,造成了資源管理的不方便。要盡可能少的進(jìn)行文件讀取,次數(shù)越少越好,減少CPU的文件讀寫操作消耗的內(nèi)存。在UI設(shè)計(jì)設(shè)計(jì)方面,盡可能扁平化,不要設(shè)計(jì)太深的節(jié)點(diǎn)。當(dāng)然這一點(diǎn)我們知道,但是行動(dòng)起來總是忘記了,其實(shí)很多時(shí)候還是因?yàn)闉榱俗非笞哉J(rèn)為合理的結(jié)構(gòu),所以就加深了層次結(jié)構(gòu),這是要改善的地方。


以上四點(diǎn)是內(nèi)存優(yōu)化過程中的一部分。第四點(diǎn)則是多個(gè)內(nèi)存優(yōu)化的集合。后面會(huì)繼續(xù)講解內(nèi)存優(yōu)化,花較多的篇幅說明內(nèi)存優(yōu)化的過程和詳細(xì)細(xì)節(jié)。

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

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

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