手遊客戶端的效能篇(三)----Unity和C#版(具體優化--UGUI,資源規範等)
接上篇:
4、Enum:列舉當Key使用或列舉轉換為String,都會有GC
5、閉包:函式和與其相關的引用環境組合成的實體。閉包IL程式碼會出個新類,頻繁呼叫一個函式時,儘量不用。
6、其他
1>update中沒必要每幀的。
2>不要常使用find,在start中快取。
3>使用內建數值,比如Vector3.zero而不是new Vector3(0, 0, 0);
4>主執行緒同步載入資源會瞬卡,非同步載入;
5>邏輯裁剪;
6>物件回收複用,物件池;
7>LOD:根據不同目標平臺制訂資源規則:主角用高,其他玩家中低;特效自動處理成H,M,L三版本;
8>meshcollider換為boxcollider
.......
(上面會持續更新一些優化中的細節)
優化流程: 測量---分析---優化---驗收
優化工具:Unity Profiler, Adreno Profiler,WeTest,UWA
效能指標:
瞬卡與平局幀數(fps)
渲染批次數(drawcall)
記憶體使用量(memory)
崩潰率(crash)
包體大小(install file size)
記憶體優化:
1>UI圖集最大1024*1024,儘量提高圖集利用率;
GPU優化:(優化Shader,減少OverDraw)
1>Fog { Mode Off } 關閉霧效;
2>fragment剔除Alpha為0的畫素,減少OverDraw;
3>Lod
CPU優化:(GC)
1>DrawCall,合批:
同一介面的UI資源放在一個圖集中,方便合批;重複利用的公用的放在common;
相鄰節點儘量使用同一圖集的圖片;
線框模式下,Rectransform重疊會增加DC;
Canvas.SendWillRenderCanvases():UI被Enable、頂點色變化、Text 元件的文字變化等時所產生的呼叫,CPU 飆高大部分情況下主要是因為UnityEngine.UI.Graphic.UpdateGeometry()重新生成了所有的頂點資料;
UGUI動態合批:Canvas合併UI元素的網格,並且生成傳送給Unity渲染管線的命令。減少一些頻繁變動的UI 元素
的Canvas 下的頂點數量;開啟介面時看不見的prefab儘量拆分,動態載入;切換active也會帶來消耗;Layout也有消耗;Raycast Target 預設不勾選;
靜態批次只需要在Inspector勾選static選項即可,場景中的多個物件如果是不動的(包括位置、縮放、旋轉等),並且共享同一材質那麼可以選擇採用靜態批次。
2>GC前面的1,2,3,4,5,6講了很多。
(持續更新)