Unity3D最佳化總結

來源:互聯網
上載者:User

標籤:blog   http   java   color   使用   os   

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 來檢查,這樣當你編譯你的遊戲時就不會出現莫名其妙的錯誤了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.