轉(zhuǎn)自http://blog.csdn.net/qq15233635728/article/details/44785765?locationNum=5
Unity導(dǎo)出ios工程如何減小運(yùn)行內(nèi)存殖演、安裝包(ipa)氧秘、以及安裝后大小(概說)
最近項(xiàng)目遇到些問題趴久,就是因?yàn)轫?xiàng)目里面彩色圖片素材比較多丸相,尺寸也比較大,制作人還不接受把壓縮圖片質(zhì)量降低很明顯彼棍。于是導(dǎo)致unity導(dǎo)出到iOS設(shè)備上出現(xiàn)了幾個(gè)問題灭忠。
1、?????運(yùn)行內(nèi)存過大座硕;在低配版的iphone4s弛作,ipad2等512m老機(jī)型機(jī)器上面,當(dāng)加載資源過多時(shí)华匾,容易引起內(nèi)存溢出映琳,導(dǎo)致應(yīng)用閃退。
2、?????Unity導(dǎo)出的ios工程過大萨西,xcode編譯出來的ipa包還算ok有鹿,但是安裝到ios設(shè)備上就大的離譜。例如60m的ipa原杂,安裝到設(shè)備上居然有700M印颤。
3、?????就是ipa導(dǎo)出包偏大穿肄。要求盡量減小到本身資源+unity空包(七八兆)左右大小年局。
以上問題,1咸产、2屬于比較嚴(yán)重的問題矢否。3 屬于進(jìn)一步優(yōu)化的問題。
針對上述問題我們采取了一系列方案脑溢,下面就其解決方案簡單闡述僵朗,所述不周之處還請指正。
一屑彻、減少程序運(yùn)行內(nèi)存验庙,更好兼容低內(nèi)存機(jī)器
程序內(nèi)存消耗過大,導(dǎo)致內(nèi)存溢出社牲,大多由于資源一次性加載過多粪薛,或者未及時(shí)清理,根源在于資源過大搏恤。
1违寿、首先,對于資源過大的問題:
音頻:我們可以盡量采用ogg格式熟空,低采樣率的音頻代替wav藤巢、MP3等高采樣率音頻。采樣率低也就代表著音頻質(zhì)量低息罗,你可以利用音頻轉(zhuǎn)換軟件掂咒,將音頻調(diào)整到可以接受的質(zhì)量。
圖片:如果需要較高質(zhì)量阱当,可多采用jpg格式俏扩,如果對質(zhì)量沒過多要求,可以保存為web格式弊添。如果有透明色那就只能png了。
這里推薦一個(gè)圖片壓縮網(wǎng)站捌木,基本上處理后油坝,他的壓縮率會達(dá)到50%以上,而且看不出有太多的失真。
2澈圈、其次彬檀,當(dāng)我們將資源導(dǎo)入unity中,unity會對資源做一些特殊的處理瞬女,例如圖片在web平臺下窍帝,默認(rèn)會使用texture、compressed壓縮诽偷。此時(shí)坤学,jpg格式或者大體成2的n次方的png圖片幾乎都可以被壓縮。
之前报慕,我們?yōu)榱藞D片效果完美深浮,一直用:gui、truecolor格式圖片眠冈,這樣確實(shí)在設(shè)備上畫面表現(xiàn)很好飞苇。
但是這樣就導(dǎo)致一個(gè)問題,一張?jiān)局挥?7k大小的圖片蜗顽,使用這個(gè)設(shè)置后會被渲染變得4m大小布卡。
當(dāng)運(yùn)行程序時(shí),它所占據(jù)的內(nèi)存就為4m雇盖,而非87k忿等。尤其是我們項(xiàng)目中,一個(gè)界面中有很多這種高質(zhì)量圖片刊懈,而且再加上有很多序列幀動(dòng)畫这弧,并且這個(gè)動(dòng)畫單張比較大,幀數(shù)還比較多虚汛。那這個(gè)內(nèi)存占據(jù)就非池依耍可怕了。我們的低配置機(jī)器僅僅512內(nèi)存卷哩,如果不合理編寫資源管理器蛋辈。那崩潰的幾率確實(shí)很大。
因此我們試驗(yàn)了幾種不同圖片格式将谊,在ios設(shè)備上冷溶,pvrtc 4bit 這種格式的圖片相對來說,內(nèi)存占據(jù)量不算高尊浓,也不是很失真逞频。不建議追求極致的圖片質(zhì)量,而消耗很大的內(nèi)存栋齿。
3苗胀、然后我們使用了動(dòng)態(tài)資源加載襟诸。
將一系列資源(圖、圖集的預(yù)設(shè))打包成為assetbundle基协,將其放置在只讀目錄StreamingAssets文件夾下歌亲。
當(dāng)使用這個(gè)資源時(shí),利用www讀取本地資源澜驮,加載到內(nèi)存陷揪。
然后馬上卸載掉鏡像。
當(dāng)不再使用這個(gè)資源時(shí)即銷毀這個(gè)對象杂穷。
但是悍缠,實(shí)際測試在真實(shí)ios設(shè)備上內(nèi)存監(jiān)測到的并非立刻降低,因此這個(gè)場景中如果資源需要比較多亭畜,還不能全部加再進(jìn)來扮休。而是要根據(jù)需要分批次加載進(jìn)來。
此外在場景切換過程中還需要經(jīng)常調(diào)用系統(tǒng)函數(shù)Resources.UnloadUnusedAssets();來清理一下? 游離的未使用 資源拴鸵。以保證內(nèi)存回收玷坠。
4、資源打包這里不再詳細(xì)敘述劲藐。詳細(xì)可以參考以下內(nèi)容:
http://www.xuanyusong.com/archives/2405
注意的是單獨(dú)寫腳本時(shí)八堡,注意最后打包參數(shù)。不同平臺打出的資源不通用聘芜。
Android上:
BuildPipeline.BuildAssetBundle(obj, null, targetPath,BuildAssetBundleOptions.CollectDependencies,BuildTarget.android)
IOS上:
BuildPipeline.BuildAssetBundle(obj, null, targetPath,BuildAssetBundleOptions.CollectDependencies,BuildTarget.iPhone)
另外兄渺,電腦上和手機(jī)上打出來的Assetbundle不能混用,不同平臺只能用自己的汰现。
5挂谍、其實(shí),資源打包針對于內(nèi)存優(yōu)化的影響并不是很大瞎饲。影響大的是資源使用的格式口叙、數(shù)量的多少。以及對資源使用的管理嗅战。
不過妄田,資源打包也有不少好處。就是:1驮捍、資源的加密型比較好疟呐;2、可以很大的減小安裝到手機(jī)上面的用量东且。3启具、加載、銷毀比較清晰珊泳,可控性較好富纸。4囤踩、加載未完成時(shí)可以了利用loading界面遮蓋旨椒,防止界面轉(zhuǎn)換時(shí)閃黑屏晓褪。
二、ipa包導(dǎo)出后安裝到真機(jī)上占據(jù)空間巨大
1综慎、我們的項(xiàng)目在開始時(shí)涣仿,并沒有多少資源師打成Assetbundle的形式的。至少場景示惊、序列幀動(dòng)畫開始的時(shí)候都沒有打好港。
后來就遇到了這個(gè)問題:
1、? 我們在windows上編譯出xcode工程時(shí)米罚,發(fā)現(xiàn)居然有700多m钧汹,覺得很奇怪,檢查了一下录择,有個(gè)data的文件夾 ? ? ? ? 比較大拔莱。
2、? 整個(gè)工程打成zip壓縮包僅僅100m
3隘竭、? 然后又在mac上面編譯出來的工程居然又達(dá)到700m
4塘秦、? 制作出來的ipa文件卻又不太大,60m左右
5动看、? 但是安裝到真機(jī)上尊剔,軟件用量卻十分大,大約700多m
2菱皆、針對這個(gè)問題我們研究發(fā)現(xiàn)须误,主要是資源文件夾下resourcedata,再經(jīng)過調(diào)查仇轻,是因?yàn)槔锩娴膱D片的問題京痢。
3、當(dāng)初為了保證圖片高質(zhì)量拯田,無論jpg還是png历造,我們都采用了gui、truecolor的設(shè)置船庇。
在上面實(shí)驗(yàn)中吭产、87k大小的文件,被渲染成4m左右大小的資源鸭轮。
我們通過解壓發(fā)現(xiàn)臣淤,編譯安裝后,ios沒有做到很好的壓縮與支持窃爷,而是將這個(gè)圖片直接轉(zhuǎn)換成tga格式存儲邑蒋。這就導(dǎo)致占據(jù)用量巨大姓蜂。
4、也就是說:運(yùn)行時(shí)他占據(jù)4m內(nèi)存
安裝時(shí)他也同樣占據(jù)著4m的硬盤用量
5医吊、針對于此钱慢,我們首先將圖片格式轉(zhuǎn)換成上述ios支持比較好的pvrtc? 4bit? 形式。
但是這種格式也有缺點(diǎn)卿堂,就是需要觀察哪些可以壓縮束莫,那些不能壓縮。經(jīng)試驗(yàn)草描,接近2的n次方的近似方形的圖片或者圖集能夠壓縮览绿,而不會圖片變形。經(jīng)過這樣的處理我們的用量初步降低為300m穗慕。
6饿敲、然后我們發(fā)現(xiàn)僅僅將資源打包還不夠,剩下的界面逛绵、場景等的預(yù)設(shè)上面還關(guān)聯(lián)了很多的圖片以及圖集怀各。如果場景不打包讓然會有很大的用量。于是我們將場景進(jìn)一步打包暑脆。除了攝像機(jī)的預(yù)設(shè)渠啤,全部打包。這樣我們的用量徹底降低了下來添吗,大約有80m多沥曹。
7、這種方式不適用初期開發(fā)碟联,因?yàn)槊慨?dāng)修改一次預(yù)設(shè)或者調(diào)整界面妓美,都要重新打包。并修改資源目錄鲤孵。著實(shí)費(fèi)力壶栋。
8、在實(shí)驗(yàn)中普监,還發(fā)現(xiàn)贵试。預(yù)設(shè)、圖片打包后凯正,就不能仍舊放在Resource目錄下毙玻,否則即使你不再引用,他依然能夠編譯到工程里面去廊散,從而不會減小最終產(chǎn)出的工程桑滩。