[Unity-9] Unity性能優化二

1、在使用數組或ArrayList對象時應當注意

[csharp] view plaincopy
  1. length=myArray.Length;  
  2.   
  3. for(int i=0;i<length;i++)  
  4.   
  5. {  
  6.   
  7. }  

避免

[csharp] view plaincopy
  1. for(int i=0;i<myArray.Length;i++)  
  2.   
  3.  {  
  4.   
  5. }  

2、如果沒有必要每幀都處理,則可以每隔幾幀處理一次

[csharp] view plaincopy
  1. void Update(){ if(Time.frameCount%6==0) { DoSomething(); }}  


3、定時重複調用可以使用InvokeRepeating函數實現,比如,啓動0.5秒後每隔1秒執行一次 DoSomeThing 函數:

[csharp] view plaincopy
  1. void Start()   
  2. {        
  3.  InvokeRepeating("DoSomeThing", 0.5f, 1.0f);  
  4. }   


4、少使用臨時變量,特別是在Update OnGUI等實時調用的函數中。

[csharp] view plaincopy
  1. void Update()  
  2. {  
  3.    Vector3 pos;  
  4.    pos=transform.position;  
  5. }  

可以改爲:

[csharp] view plaincopy
  1. private Vector3 pos;  
  2. void Update()  
  3. {  
  4.    pos=transform.position;  
  5. }  

5、主動進行垃圾回收

[csharp] view plaincopy
  1. void Update()  
  2. {  
  3.     if(Time.frameCount%50==0)  
  4.     {   
  5.       System.GC.Collection();  
  6.     }  
  7. }  


6、優化數學運算,儘量避免使用float,而使用int,特別是在手機遊戲中,儘量少用複雜的數學函數,比如sin,cos等函數。改除法/爲乘法,例如:使用x*0.5f而不是 x/2.0f 。

7、壓縮 Mesh  

導入 3D 模型之後,在不影響顯示效果的前提下,最好打開 Mesh Compression。  Off, Low, Medium, High 這幾個選項,可酌情選取。對於單個Mesh最好使用一個材質。

8、 運行時儘量減少 Tris 和 Draw Calls  

      預覽的時候,可點開 Stats,查看圖形渲染的開銷情況。特別注意 Tris 和 Draw Calls 這兩個參數。  一般來說,要做到:  Tris 保持在 7.5k 以下  ,Draw Calls 保持在 35 以下。

9、避免大量使用 Unity 自帶的 Sphere 等內建 Mesh  

      Unity 內建的 Mesh,多邊形的數量比較大,如果物體不要求特別圓滑,可導入其他的簡單3D模型代替。 

10、如果可能,將GameObject上不必要的腳本disable掉。如果你有一個大的場景在你的遊戲中,並且敵方的位置在數千米意外,這是你可以disable你的敵方AI腳本直到它們接近攝像機爲止。一個好的途徑來開啓或關閉GameObject是使用SetActiveRecursively(false),並且球形或盒型碰撞器設爲trigger。

11、刪除空的Update方法。當通過Assets目錄創建新的腳本時,腳本里會包括一個Update方法,當你不使用時刪除它。
12、引用一個遊戲對象的最合乎邏輯的組件。有人可能會這樣寫someGameObject.transform,gameObject.rigidbody.transform.gameObject.rigidbody.transform,但是這樣做了一些不必要的工作,你可以在最開始的地方引用它,像這樣:

privateTransform myTrans;
void Start()
{
    myTrans=transform;
}


13、協同是一個好方法。可以使用協同程序來代替不必每幀都執行的方法。(還有InvokeRepeating方法也是一個好的取代Update的方法)。

14、儘可能不要再Update或FixedUpdate中使用搜索方法(例如GameObject.Find()),你可以像前面那樣在Start方法裏獲得它。

15、不要使用SendMessage之類的方法,他比直接調用方法慢了100倍,你可以直接調用或通過C#的委託來實現。

16、使用javascript或Boo語言時,你最好確定變量的類型,不要使用動態類型,這樣會降低效率,你可以在腳本開頭使用#pragmastrict 來檢查,這樣當你編譯你的遊戲時就不會出現莫名其妙的錯誤了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章