Related Posts Plugin for WordPress, Blogger...

6-22 Reducing The File Size Of Your Build

繼上一章向大家介紹Build Report Tool插件後,接著要來實際操作如何減少Build的檔案大小啦。先引用Unity官方文章的重要觀念:

Unity re-codes imported Assets into its own internal formats, so the choice of source Asset type is not relevant. For example, if you have a multi-layer Photoshop Texture in the Project, it is flattened and compressed before building. Exporting the Texture as a .png file does not make any difference to build size, so you should stick to the format that is most convenient for you during development.

意思就是說,Unity將匯入的Assets重新編碼為自己的內部格式,因此跟Assets原本是什麼檔案類型無關。例如,如果項目中有Photoshop檔案,Unity在構建之前會將其壓平並壓縮,就算你把psd檔改成png檔,對Build後的檔案大小也不會有任何幫助。

Unity strips most unused Assets during the build, so you don’t gain anything by manually removing Assets from the Project. The only Assets that are not removed are scripts (which are generally very small anyway) and Assets in the Resources folder (because Unity can’t determine which of these are needed and which are not). With this in mind, you should make sure that the only Assets in the Resources folder are the ones you need for the game. You might be able to replace Assets in the Resources folder with AssetBundles - this means that Unity loads Assets dynamically, thereby reducing the player size.

Unity在Build的時候會盡可能的去除大部分未使用的Assets。唯一未刪除的Assets是Script,以及Resources資料夾中的Assets(因為Unity無法確定哪些是需要的,哪些不需要)。應該確保Resources文件夾中都是有需要的Assets。或者可以使用AssetBundles替換Resources文件夾中的Assets - 這意味著Unity會動態加載Assets,從而減少Build後的大小。

上述觀念引用自https://docs.unity3d.com/Manual/ReducingFilesize.html

好的,接下來實際操作怎麼消減Build後的檔案大小。首先用Build Report Tool分析目前佔用容量大的資源有哪些。以我的遊戲為例,最多的是Texture,如第一名的是wizard_01_albedo DEMO.png,Build後會膨脹到21.3MB。

接著我就來檢查這張貼圖到底出了什麼問題,從Inspector中的最下面可以看到該Texture的檔案大小與格式,其中我發現Android平台的Override for Android選項被打勾了,而且Format還選擇了RGBA 32 bit,這意味著輸出Android的時候,這張貼圖不會被壓縮,難怪檔案大小膨脹那麼多。

於是我將該選項取消,讓Unity採用預設的選項。Unity預設在Android平台會使用壓縮格式:RGBA Compressed ETC2或RGB Compressed ETC2,以上兩種格式僅差在是否包含Alpha通道。如果該貼圖用不到Alpha通道就記得要選RGB,容量能縮減更多。有關Unity在各平台的預設壓縮格式,更多詳情可參考官方文件:
https://docs.unity3d.com/Manual/class-TextureImporterOverride.html



以下提供官方文件的表格以供參考。
PlatformColor modelNoneNormal quality (Default)High qualityLow quality (higher performance)
Windows, Linux, macOS, PS4, XBox OneRGBRGB 24 bitRGB Compressed DXT1RGB(A) Compressed BC7RGB Compressed DXT1
RGBARGBA 32 bitRGBA Compressed DXT5RGB(A) Compressed BC7RGBA Compressed DXT5
HDRRGBA HalfRGB Compressed BC6HRGB Compressed BC6HRGB Compressed BC6H
WebGLRGBRGB 24 bitRGB Compressed DXT1RGB Compressed DXT1RGB Compressed DXT1
RGBARGBA 32 bitRGBA Compressed DXT5RGBA Compressed DXT5RGBA Compressed DXT5
Android (default subTarget)RGBRGB 24 bitRGB Compressed ETC2RGB Compressed ETC2RGB Compressed ETC2
RGBARGBA 32 bitRGBA Compressed ETC2RGBA Compressed ETC2RGBA Compressed ETC2
iOSRGBRGB 24 bitRGB Compressed PVRTC 4 bitsRGB Compressed PVRTC 4 bitsRGB Compressed PVRTC 2 bits
RGBARGBA 32 bitRGBA Compressed PVRTC 4 bitsRGBA Compressed PVRTC 4 bitsRGBA Compressed PVRTC 2 bits
tvOSRGBRGB 24 bitRGB Compressed ASTC 6x6 blockRGB Compressed ASTC 4x4 blockRGB Compressed ASTC 8x8 block
RGBARGBA 32 bitRGBA Compressed ASTC 6x6 blockRGBA Compressed ASTC 4x4 blockRGBA Compressed ASTC 8x8 block
RGBARGBA 32 bitRGBA 16 bitRGBA 16 bitRGBA 16 bit

原本這張貼圖要佔用21.3MB。

修改了以後只需佔用2.7MB,差很多。

如果壓縮還不能滿足你對容量優化的渴望,接著還有一個Unity官方提供的方法。在剛剛提到的選項中,還可以改變Texture的Max Size,此設定不會更動到原圖片的大小。前面有提過,所有的資源都會被Unity重新編譯成自己的格式,你在Inspecotr中修改的Size與壓縮方式都只會更動到Unity的內部格式,所以你可以根據不同的平台選擇適合的Size。

那我先嘗試將Max Size從2048降到1024。

檔案大小瞬間從2.7MB降到0.7MB。

讓我們來比較看看,下圖是2048解析度在遊戲中的樣子。

下圖是1024。

下圖是256,好像有一點點變質了?總之,降到你覺得不能接受的程度後就可以停下來了。

所以大概可以知道,我能接受的變異程度是Max Size到512為止。請大家根據自己的需求進行調整唷,有些人應該會覺得行動平台的螢幕小,就算再降一點點應該也沒關係。

然後,進行了一些修改以後記得進入遊戲看看,不要一口氣改太多,等到發現遊戲壞掉了卻不知道是從哪一步開始壞掉的。

修改人物貼圖的時候也會特別注意,有沒有劣化得太誇張,畢竟是主角啦。

看起來還OK。

有時候你可能會看到這段訊息『Only textures with width/height being multiple of 4 can be compressed to ETC2 format』,意即貼圖的長寬必須要是4的冪次方才可以壓縮成ETC2的格式,這部分就要特別注意嘍,不是4的冪次方就要把長寬拉出一些空白。如果怕浪費的空白的話,可以合併其他的貼圖進來,多多利用空白。

有時候覺得貼圖多一個一個慢慢改很煩。

可以善用Project視窗的搜尋功能,右上角有一個類型搜索的選項,選擇Texture,左邊也可以選擇以哪個資料夾為主,比方說我只想找Modular Trees底下的Texture,Project的搜尋功能可以很方便的辦到。

接著,除了Texture以外,Mesh跟Animation也可以壓縮。比方如下圖的BaseFemale.FBX。

點選以後,在Inspector的Model視窗中,有一個Mesh Compression選項,預設是Off,可以選擇Low、Medium、High。引用官方說明:
Mesh and Animation compression uses quantization, which means it takes less space, but the compression can introduce some inaccuracies. Experiment with what level of compression is acceptable for your models.
大致意思是說由於壓縮採用量化(Quantization)方式,所以會導致模型有不準確的問題,最好是使用了壓縮以後要測試模型,看遊戲中會不會產生問題。

再來是Dll的部分,其中官方特別提醒,Unity預設是不需要用System.dll以及System.Xml.dll,預設只會用到mscorlib.dll、Boo.Lang.dll、UnityScript.Lang.dll、UnityEngine.dll

由於這兩個dll佔用的空間滿大的,如果遊戲中用不到的話就盡量避開。否則Unity也必須將其Build進去,如下圖,System.dll佔了1.6MB。

System.Xml.dll佔了1.21MB。如果有必須使用Xml的話,官方建議使用Mono.xml,相較之下容量小很多。

最後一個官方建議是,可以在Player Setting中選擇Api Compatibility Level,有.NET 2.0與.NET 2.0 Subset兩個選項。使用Subset的話當然在容量上會比較小,但如果你的遊戲中還用到了很多第三方的Library的話,就比較容易會因為Subset缺少了一些.NET函式出問題。

好的,首先優化容量之前的Build後的檔案大小為207.37MB,其中原始Textures就佔了534.9MB。

經過上述一系列的優化後,檔案大小下降到150.05MB,Textures也下降到248.7MB。嗯....看來離預想中的100MB還有點差距,沒關係,往後再繼續優化。

留言