Unity3D如何減少安裝包大小


譯官方文檔: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”中進行設置 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM