Unity手遊的性能優化過程更像是一門時空轉換的藝術, 持續在CPU和內存之間取得一個平衡。空間不足時則需要釋放一些無用數據,以獲得更優的空間使用率;時間太長時就需要降低不必要的函數開銷。以下是騰訊遊戲在Unity遊戲開發過程中內存和性能優化的一系列解決策略和方法。
貼圖:
l 控制貼圖大小,儘量不要超過 1024 x1024;
l 儘量使用2的n次冪大小的貼圖,否則GfxDriver裏會有2份貼圖;
l 儘量使用壓縮格式減小貼圖大小;
l 若干種貼圖合併技術;
l 去除多餘的alpha通道;
l 不同設備使用不同的紋理貼圖,分層顯示;
模型:
l 儘量控制模型的面數,小於1500會比較合適;
l 不同設備使用不同的模型面數;
l 儘量保持在30根骨骼內;
l 一個網格不要超過3個material;
動畫:
l N種動畫壓縮方法;
l 儘量減少骨骼數量;
聲音:
l 採用壓縮MP3 和 wav;
資源方面的優化:
l 使用 Resource.Load 方法在需要的時候再讀取資源;
l 各種資源在使用完成後,儘快用Resource.UnloadAsset和UnloadUnusedAsset卸載掉;
l 靈活運用AssetBundle的Load和Unload方法動態加載資源,避免主要場景內的初始化內存佔用過高;(實現起來真的很難…)
l 採用www加載了AssetBundle後,要用www.Dispose 及時釋放;
l 在關卡內謹慎使用DontDestroyOnLoad,被標註的資源會常駐內存;
代碼的優化:
l 儘量避免代碼中的任何字符串連接,因爲這會給GC帶來太多垃圾;
l 用簡單的“for”循環代替“foreach”循環;
l 爲所有遊戲內的動態物體使用內存對象池,可以減少系統開銷和內存碎片,複用對象實例,構建自己的內存管理模式,減少Instantiate和Destory;
l 儘量不使用LINQ命令,因爲它們一般會分配中間緩器,而這很容易生成垃圾內存;
l 將引用本地緩存到元件中會減少每次在一個遊戲對象中使用 “GetComponent” 獲取一個元件引用的需求;
l 減少角色控制器移動命令的調用。移動角色控制器會同步發生,每次調用都會耗損較大的性能;
l 最小化碰撞檢測請求(例如ray casts和sphere checks),儘量從每次檢查中獲得更多信息;
l AI邏輯通常會生成大量物理查詢,建議讓AI更新循環設置低於圖像更新循環,以減少CPU負荷;
l 要儘量減少Unity回調函數,哪怕是空函數也不要留着;(例如空的Update、FixedUpdate函數)
l 儘量少使用FindObjectsOfType函數,這個函數非常慢,儘量少用且一定不要在Update裏調用;
l 千萬一定要控制mono堆內存的大小;
轉自:http://blog.csdn.net/wetest_tencent/article/details/51784782