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
以下提供官方文件的表格以供參考。
原本這張貼圖要佔用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還有點差距,沒關係,往後再繼續優化。
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
以下提供官方文件的表格以供參考。
Platform | Color model | None | Normal quality (Default) | High quality | Low quality (higher performance) |
---|---|---|---|---|---|
Windows, Linux, macOS, PS4, XBox One | RGB | RGB 24 bit | RGB Compressed DXT1 | RGB(A) Compressed BC7 | RGB Compressed DXT1 |
RGBA | RGBA 32 bit | RGBA Compressed DXT5 | RGB(A) Compressed BC7 | RGBA Compressed DXT5 | |
HDR | RGBA Half | RGB Compressed BC6H | RGB Compressed BC6H | RGB Compressed BC6H | |
WebGL | RGB | RGB 24 bit | RGB Compressed DXT1 | RGB Compressed DXT1 | RGB Compressed DXT1 |
RGBA | RGBA 32 bit | RGBA Compressed DXT5 | RGBA Compressed DXT5 | RGBA Compressed DXT5 | |
Android (default subTarget) | RGB | RGB 24 bit | RGB Compressed ETC2 | RGB Compressed ETC2 | RGB Compressed ETC2 |
RGBA | RGBA 32 bit | RGBA Compressed ETC2 | RGBA Compressed ETC2 | RGBA Compressed ETC2 | |
iOS | RGB | RGB 24 bit | RGB Compressed PVRTC 4 bits | RGB Compressed PVRTC 4 bits | RGB Compressed PVRTC 2 bits |
RGBA | RGBA 32 bit | RGBA Compressed PVRTC 4 bits | RGBA Compressed PVRTC 4 bits | RGBA Compressed PVRTC 2 bits | |
tvOS | RGB | RGB 24 bit | RGB Compressed ASTC 6x6 block | RGB Compressed ASTC 4x4 block | RGB Compressed ASTC 8x8 block |
RGBA | RGBA 32 bit | RGBA Compressed ASTC 6x6 block | RGBA Compressed ASTC 4x4 block | RGBA Compressed ASTC 8x8 block | |
RGBA | RGBA 32 bit | RGBA 16 bit | RGBA 16 bit | RGBA 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還有點差距,沒關係,往後再繼續優化。
留言
張貼留言