譯官方文檔: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
需要這么做的目的和好處就不多說了。
第一步要做的就是:看看哪些文件是最占空間的,那么它們就是首選優化對象了。
你可以在剛剛完成一次build之后在“Editor Log”中找到這些信息。
如何打開Editor Log:
在Mac上看起來就是這樣的了:
可以看出這份log提供了一份資源總括:各種類型資源的總大小,以及所占百分比。同時還降序列出了單個文件的大小。
順帶一提,資源類型中的“File headers”它們並不是資源本身,而是加在原始資源上,用來存儲“引用”與“配置信息”的額外數據。通常可以忽略這些數據的大小,但如果在你的“Resources”文件夾里有着十分龐大的資源文件的話,這些數據也可能會很大。。
這份log可以幫助你鑒定哪些文件是你或許想要刪掉或者進行優化的。
不過在開工之前,還需要先了解幾點:
1、Unity再編碼會把資源導成它自己的內部格式,所以資源源文件的類型是不相干的。比如你有一個多圖層的PS紋理,那么在build之前它就會被拼接、壓縮。所以刻意把這份紋理轉成PNG格式其實對減少包大小並沒有幫助。在開發時還是用最方便的格式就好了。
2、Unity會在build時去掉那些你的項目中沒有使用到的資源,所以不需要我們手動找出來刪掉了。但是腳本是不會被刪掉的(不過它們不占資源),還有“Resources”文件夾里的全部資源,也是不會自動幫你刪除的(因為Unity無法判斷這里面哪些是需要用到的)。所以我們要確保“Resources”文件夾里的都是我們真正要用到的。當然,你還可以通過動態加載AssetBundles的方式來代替“Resources”文件夾里的資源,以減少包大小。
一些建議:
紋理(Textures)
紋理通常會占據大部分空間。第一步要做的就是選用經壓縮的紋理格式(DXT 或者 PVRTC)。如果這樣沒有減少它的所占用空間,那么試試縮小紋理的尺寸吧。你不需要對資源本身進行修改,只要在 Project 下選中紋理,然后在 Inspectpr 下設置Max Size就行了。
有一個好辦法就是:在場景中找到使用了該紋理的object,放大畫面,然后一邊降低 Max Size ,一邊看場景中的object,直到它看起來比較糟糕,就可以知道怎樣是最合適的了。。
由以上幾張圖對比來看,我們就能發現,選擇512甚至256的Max Size,效果都是可以的,而且資源大小也能有顯著的減少。修改紋理的Max Size並不會影響到資源本身,只是改變了它在游戲里的分辨率。下表列出了不同圖片格式所占用空間的大小(單位bpp:字節/像素)
一張圖片的大小計算公式:width * height * bpp,如果你使用的是mipmap貼圖,那么其大小將是普通圖片的3倍左右。
Unity默認在導入紋理時就會進行壓縮,為了在開發時節約時間,我們可以在偏好設置里手動關掉此功能
而在build時,Unity不管你有沒有勾選這一項,都會對紋理進行壓縮。
網格與動畫(Meshes and Animations)
網格與導入的動畫(Animation Clips)都可以被壓縮。在選中一個模型之后,就可以在Inspector中進行設置了。
不過對它們進行壓縮,是可能造成誤差的。所以最好先弄清楚什么程度的壓縮是可接受范圍內的。另外,mesh的壓縮僅僅是減少數據文件的大小,並不會減少運行時的內存消耗。而減少動畫關鍵幀,則會讓兩者都有所減少,一般情況下我們都應該開啟。
動態鏈接庫(DLLs)
默認情況下,Unity只會在build時包含以下dll:
我們應該避免對 System.dll 或者 System.Xml.dll 有所引用,否則還是會在build時包含進來,而它們也會占用數M的空間。
如果在游戲中確實需要解析XML,那么可以使用“Mono.Xml.zip”來代替系統級的dll。此外,大多數泛型容器都已經包含在標准庫中,只有少數幾個在System.dll里,所以可能的話,也應該避免使用到它。
減少手機上使用的 .NET 庫的大小
Unity為移動設備提供了兩套 .NET 的API:.NET 2.0 和.NET 2.0 Subset
.NET 2.0 提供了幾乎整套的API功能,但是很多時候游戲都用不上那么多,導致大量多余的代碼占用了寶貴的空間資源。為了避免浪費,我們就可以用Unity提供的 .NET 2.0 Subset(相當於.NET 2.0的一個子集)。為節省資源,這里面很多一般用不到的例程庫都被移除了,所以這一優化也會是很有用的,只是需要確保我們的代碼能夠正常工作。
可在“Player Settings”中進行設置
