譯官方文檔:http://docs.unity3d.com/Manual/ReducingFilesize.html
PDF文檔:http://www.rukawa.cn/Uploads/Attachment/ReducingFilesize/ReducingFilesize.pdf
原文地址:http://www.rukawa.cn/index.php?s=/home/article/detail/id/27.html
需要這么做的目的和好處就不多說了。
第一步要做的就是:看看哪些文件是最占空間的,那么它們就是首選優(yōu)化對(duì)象了。
你可以在剛剛完成一次build之后在“Editor Log”中找到這些信息。
如何打開Editor Log:

在Mac上看起來就是這樣的了:

可以看出這份log提供了一份資源總括:各種類型資源的總大小,以及所占百分比。同時(shí)還降序列出了單個(gè)文件的大小。
順帶一提,資源類型中的“File headers”它們并不是資源本身,而是加在原始資源上,用來存儲(chǔ)“引用”與“配置信息”的額外數(shù)據(jù)。通??梢院雎赃@些數(shù)據(jù)的大小,但如果在你的“Resources”文件夾里有著十分龐大的資源文件的話,這些數(shù)據(jù)也可能會(huì)很大。。
這份log可以幫助你鑒定哪些文件是你或許想要?jiǎng)h掉或者進(jìn)行優(yōu)化的。
不過在開工之前,還需要先了解幾點(diǎn):
1、Unity再編碼會(huì)把資源導(dǎo)成它自己的內(nèi)部格式,所以資源源文件的類型是不相干的。比如你有一個(gè)多圖層的PS紋理,那么在build之前它就會(huì)被拼接、壓縮。所以刻意把這份紋理轉(zhuǎn)成PNG格式其實(shí)對(duì)減少包大小并沒有幫助。在開發(fā)時(shí)還是用最方便的格式就好了。
2、Unity會(huì)在build時(shí)去掉那些你的項(xiàng)目中沒有使用到的資源,所以不需要我們手動(dòng)找出來刪掉了。但是腳本是不會(huì)被刪掉的(不過它們不占資源),還有“Resources”文件夾里的全部資源,也是不會(huì)自動(dòng)幫你刪除的(因?yàn)閁nity無法判斷這里面哪些是需要用到的)。所以我們要確?!癛esources”文件夾里的都是我們真正要用到的。當(dāng)然,你還可以通過動(dòng)態(tài)加載AssetBundles的方式來代替“Resources”文件夾里的資源,以減少包大小。
一些建議:
紋理(Textures)
紋理通常會(huì)占據(jù)大部分空間。第一步要做的就是選用經(jīng)壓縮的紋理格式(DXT 或者 PVRTC)。如果這樣沒有減少它的所占用空間,那么試試縮小紋理的尺寸吧。你不需要對(duì)資源本身進(jìn)行修改,只要在 Project 下選中紋理,然后在 Inspectpr 下設(shè)置Max Size就行了。

有一個(gè)好辦法就是:在場(chǎng)景中找到使用了該紋理的object,放大畫面,然后一邊降低 Max Size ,一邊看場(chǎng)景中的object,直到它看起來比較糟糕,就可以知道怎樣是最合適的了。。








由以上幾張圖對(duì)比來看,我們就能發(fā)現(xiàn),選擇512甚至256的Max Size,效果都是可以的,而且資源大小也能有顯著的減少。修改紋理的Max Size并不會(huì)影響到資源本身,只是改變了它在游戲里的分辨率。下表列出了不同圖片格式所占用空間的大?。▎挝籦pp:字節(jié)/像素)

一張圖片的大小計(jì)算公式:width * height * bpp,如果你使用的是mipmap貼圖,那么其大小將是普通圖片的3倍左右。
Unity默認(rèn)在導(dǎo)入紋理時(shí)就會(huì)進(jìn)行壓縮,為了在開發(fā)時(shí)節(jié)約時(shí)間,我們可以在偏好設(shè)置里手動(dòng)關(guān)掉此功能

而在build時(shí),Unity不管你有沒有勾選這一項(xiàng),都會(huì)對(duì)紋理進(jìn)行壓縮。
網(wǎng)格與動(dòng)畫(Meshes and Animations)
網(wǎng)格與導(dǎo)入的動(dòng)畫(Animation Clips)都可以被壓縮。在選中一個(gè)模型之后,就可以在Inspector中進(jìn)行設(shè)置了。

不過對(duì)它們進(jìn)行壓縮,是可能造成誤差的。所以最好先弄清楚什么程度的壓縮是可接受范圍內(nèi)的。另外,mesh的壓縮僅僅是減少數(shù)據(jù)文件的大小,并不會(huì)減少運(yùn)行時(shí)的內(nèi)存消耗。而減少動(dòng)畫關(guān)鍵幀,則會(huì)讓兩者都有所減少,一般情況下我們都應(yīng)該開啟。

動(dòng)態(tài)鏈接庫(DLLs)
默認(rèn)情況下,Unity只會(huì)在build時(shí)包含以下dll:

我們應(yīng)該避免對(duì) System.dll 或者 System.Xml.dll 有所引用,否則還是會(huì)在build時(shí)包含進(jìn)來,而它們也會(huì)占用數(shù)M的空間。
如果在游戲中確實(shí)需要解析XML,那么可以使用“Mono.Xml.zip”來代替系統(tǒng)級(jí)的dll。此外,大多數(shù)泛型容器都已經(jīng)包含在標(biāo)準(zhǔn)庫中,只有少數(shù)幾個(gè)在System.dll里,所以可能的話,也應(yīng)該避免使用到它。
減少手機(jī)上使用的 .NET 庫的大小
Unity為移動(dòng)設(shè)備提供了兩套 .NET 的API:.NET 2.0 和.NET 2.0 Subset
.NET 2.0 提供了幾乎整套的API功能,但是很多時(shí)候游戲都用不上那么多,導(dǎo)致大量多余的代碼占用了寶貴的空間資源。為了避免浪費(fèi),我們就可以用Unity提供的 .NET 2.0 Subset(相當(dāng)于.NET 2.0的一個(gè)子集)。為節(jié)省資源,這里面很多一般用不到的例程庫都被移除了,所以這一優(yōu)化也會(huì)是很有用的,只是需要確保我們的代碼能夠正常工作。
可在“Player Settings”中進(jìn)行設(shè)置

移除無用的代碼
目前我們的項(xiàng)目比較適合使用Strip ByteCode選項(xiàng),并配合link.xml使用,link.xml放到項(xiàng)目的Assetes目錄下:

對(duì)于android平臺(tái),如果包實(shí)在太大,可以使用 Split Application Binary 功能
在Player Setting > Publishing Settings里,

關(guān)于Split Application Binaryhttp://www.ceeger.com/Manual/android-OBBsupport.html