相比于Android或者iOS原生App,Unity3D引擎開發(fā)的游戲在冷啟動時間上確實比較長。我在三星SM-N9008手機(jī)上的測試結(jié)果是一個不算大的項目,如果使用Mono后端編譯悼瘾,則需要10秒左右的冷啟動時間,而如果使用 IL2CPP 后端編譯审胸,則冷啟動時間為7秒左右亥宿。
IL2CPP相比于Mono確實能夠加快冷啟動時間,這是可以預(yù)期的砂沛。因為在Mono編譯的情況下烫扼,每個 .cs 文件都是一個 TextAsset 文件,而所有的 .cs 文件都需要在冷啟動時候全部加載到內(nèi)存中尺上,這些碎片化的文件加載操作都會占用冷啟動時間材蛛。關(guān)于冷啟動需要加載哪些文件的分析,可以參考Unity3D游戲在啟動時都默認(rèn)加載哪些資源怎抛。而IL2CPP會把所有的C#代碼編譯成C 代碼卑吭,然后再進(jìn)行編譯、鏈接等操作马绝,這樣就減少了C#豆赏、DLL所帶來的開銷。
在項目中我們應(yīng)該怎樣加快游戲的冷啟動速度呢?經(jīng)過調(diào)研掷邦,我總結(jié)出以下幾個優(yōu)化的要點:
1.項目中添加一個Loading場景白胀,這個場景會是游戲啟動的第一個場景。
2.在Loading場景中盡量少的依賴抚岗,盡量少的紋理依賴或杠、AssetBundle依賴、代碼依賴宣蔚,總之向抢,這個Loading場景一定要盡量少的依賴,這個場景一定要盡量簡單胚委,這樣才能保證盡快的加載速度挟鸠。
3.在游戲中盡量少的使用Resources方式管理資源,Resources目錄下面的所有資源會在ResourceManager中記錄下來亩冬,而ResourceManager就是一個文件艘希,通常是一個YAML格式的文本文件。而這個文件是會在冷啟動時加載的硅急。所以Resources目錄下面的有越多的資源覆享,那么這個ResourceManager就會越大,加載時間也會越長铜秆。
4.使用Resources方式管理資源還有一個壞處淹真,就是所有的資源都是統(tǒng)一管理的,這樣的資源的管理粒度沒辦法控制连茧。建議使用AssetBundle的方式管理,這樣可以使用多個AssetBundle來管理資源巍糯。把在Loading場景中需要的最小資源集放在一個AssetBundle中啸驯,這樣在冷啟動時啟動Loading場景時,只需要加載一個AssetBundle即可祟峦。選擇合適的粒度管理AssetBundle罚斗,可以在合適的時候加載某一個AssetBundle,不使用時就可以卸載某一個AssetBundle宅楞。
5.在Loading場景中针姿,添加一個進(jìn)度條,然后 同步加載 進(jìn)入主場景所需要的AssetBundle厌衙,這樣用戶就不會感到等待時間太煩躁了距淫。同步加載要比異步加載時間更短。
6.紋理資源在游戲中一般是最大的資源婶希,選擇合適的壓縮格式進(jìn)行壓縮榕暇,既可以減少內(nèi)存占用,又能夠加快資源的加載速度。壓縮格式的選擇要從顯示效果和壓縮率上進(jìn)行權(quán)衡彤枢。一般在Android上使用ETC格式狰晚,在iOS上使用PVRTC格式,在某些情況下缴啡,可能還可以考慮使用Alpha通道分離技術(shù)進(jìn)行壓縮處理壁晒。
7.代碼文件可以編譯成 .dll 文件, 減少大量TextAsset文件導(dǎo)致的碎片化加載時間业栅。
8.強烈建議使用IL2CPP后端讨衣,如果使用IL2CPP,則可以忽略第7條式镐。