Unity3D培訓:MMORPG游戲優化經驗分享(三)
來源:
奇酷教育 發表于:
奇酷教育-unity3D培訓_unity3D游戲_unity3D教程
Unity3D培訓:MMORPG游戲優化經驗分享(三),在優化
Unity游戲時,我們一般從四個方面:CPU、GPU、內存、工程配置等入手,它們都可能是影響游戲性能瓶頸的關鍵。
每一個Mesh的壓縮選項、Read/Write選項都要根據Mesh使用方式進行單獨設置,同時要做好當Mesh存在雙份數據時,CPU端數據的及時釋放。合理的減面也是必不可少的。
壓縮紋理的使用是毋庸置疑,而壓縮格式要根據項目的機型適配靈活選擇,保證質量和體積都能滿足需要。當編輯器中刷地形紋理時,需要紋理開啟Read/Write,而在打包時要關閉這個選項。
每個紋理的尺寸要根據它的用途、實際測試時內存占用的情況,進行合理的限制,不能隨意設定它。對于圖集需要最大限度利用面積,避免浪費寶貴的內存。另外當紋理使用ETC2、ASTC格式時,在不支持這些格式的設備上,壓縮紋理會被fallback為無壓縮的RGBA格式,不但增大了內存占用,同時增加了fallback的CPU開銷。
AnimationClip可以通過壓縮浮點數精度,剔除無用的scale曲線降低內存占用。同時AnimationClip加載策略也對內存占用有很大影響,全部預加載還是按需異步加載,需要根據項目實際情況決定。
Mono進行內存分配時,在不同類型的數據對象在內存中是相鄰的存在內存塊里,如果說釋放了一個數組,它所占的內存被釋放了。但是這個區域是不會還給系統內存,依然保留著。接著又創建了新的對象,新對象的內存大小比剛才被釋放的空間大,就無法直接放入這個空間,只能由Mono申請一份新的內存來存放。當Mono申請新內存時,Mono堆內存一般會擴大很大一部分,如見下圖05所示。

在使用數組類型的對象時,如果初始化時時非定長數組,數組實際容量會根據Add操作以0、4、8、16、32倍逐步擴大,其中大量空間為Null,浪費了內存。這種情況常出現在客戶端初始化數據表保存到List、Dictionary時。
當我們需要手動釋放一些對象的內存時,會有很多種方式,Unity提供了很多卸載各種資源的函數。主動調GC.collect是不必要的,如果一個對象的引用不是Null時,是不可能釋放它的。GC只需要做好對象引用的清理就可以,剩下的還是由GC機制自動管理更好。我們可以通過自定義內存池和資源管理器,來很精細的控制每一種資源的生命周期。
AssetBundle壓縮格式一般使用LZ4,但要注意AssetBundle的合理Unload時機。而LZMA格式,由于存在加載時解壓后重壓縮為LZ4的開銷,一般情況下不建議使用。主Bundle卸載時,與它關聯的依賴Bundle一定要根據引用計數來控制是否可以卸載,否則依賴Bundle的Asset容易引發內存泄露。
IL2CPP在安卓系統使用時,要注意libil2coo.so的文件大小。在安卓系統中,so會在游戲啟動后直接加載在內存中,它的內存占用大小基本上和文件大小差不多。所以so的尺寸要有所控制,否則會影響整個游戲的內存數值。所以,使用il2cpp時要注意值類型的泛型、重復代碼等容易增大il2cpp的cpp代碼體積的情況。
以上就是
奇酷為大家分享的“Unity3D培訓:MMORPG游戲優化經驗分享(三)”謝謝大家觀看,如果對unity3D感興趣的話,想學
unity3D培訓的,也可以在線咨詢,我們將竭誠為你解答。