1. 程式人生 > >Unity 效能優化方案

Unity 效能優化方案

** c# 語言層面的優化**
1:主要思想是減少存的動態分配和釋放,以及記憶體洩露,減少垃圾回收。
(1)字串的處理 使用stringbuild 類代替string 進行多個字串的拼接。
(2)String.format();
以上的方法都是效能比較優化的方法
避免使用“+”“aaa”+“bbb”這種方式 原因是“+”對字串進行拼接,會導致臨時
堆string 物件發生頻繁的堆物件的分配和釋放。
2:儘可能使用for迴圈代替foreach
陣列 泛型list<> 一律使用for ,字典使用foreach
原因: 每次foreach產生一個臨時的迭代器物件,迭代器會額外的分配記憶體


3:頻繁呼叫的函式中,如果有臨時變數是引用型別,要將其改為成員變數。避免頻繁的堆物件的建立和釋放。
4:如果函式執行需要一個List 需要設定List為成員變數 獨立與函式的執行,可以
通過clear()函式清空,重複使用全域性成員集合,清空函式不會刪除記憶體空間,大大的減輕效能的負擔。
5:避免使用Lambda表示式,存在記憶體洩露的記憶體隱患。
6:儘量使用物件池 避免物件的頻繁建立和釋放,導致大量無效記憶體的積累,引發GC(垃圾回收)操作,造成效能的降低
7:避免裝箱和拆箱的操作,會導致堆記憶體的分配。
8:避免使用AraayList會把所有插入的資料當作object類處理,存在一個裝箱的過程
儘量使用泛型List<>;
9:避免使用反射機制,執行時獲取型別資訊,效能低下。
10:即時的將物件設定為null 委託事件即時登出。
Unity指令碼開發方面

基本思想減少動態記憶體分配和釋放,減少耗時函式的呼叫,儘可能的使用快取。
1:控制Startcorountien 的使用次數,避免頻繁的開啟協程,開啟一個協程至少分配37B的記憶體空間(corountien類的例項 分配21B Enumerator 分配16B)
如果僅僅是延遲執行,定時執行函式,可以使用invoke invokerepeating 代替
2:物件查詢 gameobject.find(); 全域性的查詢方式,無法查詢隱藏的物件,效率低下
Transform.find 從自身位置查詢,效能較優的推薦方法
Gameobject.findobjectswithTag 通過標籤查詢,效率較高,但是需要設定標籤稍顯麻煩。
建議在Awake 或者Start 函式中查詢物件並儲存引用,切忌在Update中動態的查詢
3:快取元件
注意獲取元件的方法GetCompent 方法大約會分配39B的堆記憶體,並且GetCompent是去訪問unity原生程式碼效率很低,使用快取訪問,效能相差幾十倍。快取訪問效能要高得多。
(a)儘量避免在Update函式中做計算,可以使用InvokeRepeating,間隔一段計算一次。
(b)避免使用SendMessage 效能底下,使用了反射機制,要使用委託 delegate的事件模擬訊息機制。
(c)刪除無用的預製體上的元件,刪除類中無用的函式。
(d)指令碼的禁用,指令碼使用的時候開啟,不用的時候關閉,需要專門寫一套管理機制。
圖形方面

1.不要使用實時陰影,使用陰影紋理或者簡單的圖片模擬陰影。
2.減少頂點,減少三角面數,峰值小於10w面/每幀,使用LOD進行多層次模型設定,進行遮擋。
3.減少Drawcall 峰值<200 對場景物件 比如說:石頭,樹木等使用相同材質相同貼圖的物體進行批處理,降低DC。人物模型(人物模型一般都是帶骨骼的)SkinMesh。即便使用相同的材質貼圖,DC也不能進行批處理。使用Lightmap技術降低DC。 UI圖素進行合併(打包圖集)降低DC。
4.儘量使用簡單材質,適合移動平臺(手機)Mobile這種Shader或者使用自定義一些優化過的Shader,高階Shader嚴重降低幀率,加大能耗,或者不可用。
5.在紋理和質量之間做平衡,在保證質量不受太大影響的情況下,儘量使用小尺寸的紋理,提升效率。減少安裝包的大小,九宮格等
6.減少骨骼數量的使用15個上下左右,減少粒子系統,粒子的數量。儘量減少粒子數量。
7.共享材質 多一個材質DC就會上升 使用共享材質 將多張貼圖畫在一張較大的貼圖上面,達到共享材質的作用。
8.減少,水面折射效果,或者霧效果。
程式設計過程中難免會出現差錯,歡迎大牛批評指正。本人專注圖形影象開發,歡迎大家共同交流與學習。