關於StartCoroutine的簡單線程使用

 

StartCoroutine在unity3d的幫助中叫作協程,意思就是啓動一個輔助的線程。
javascript

在C#中直接有Thread這個線程,可是在unity中有些元素是不能操做的。這個時候能夠使用協程來完成。java

使用線程的好處就是不會出現界面卡死的狀況,若是有一次很是大量的運算,沒用線程就會出現假死的狀況。post

下面經過一個簡單的例子來講明使用協程的好處:測試

 

 

[csharp]  view plain copy
 
  1. void OnGUI()  
  2.     {  
  3.         GUI.Label(new Rect(0, 0, 200, 50), "測試1:" + result);  
  4.         if (GUI.Button(new Rect(0, 100, 100, 50), "開啓協程"))  
  5.         {  
  6.             StartCoroutine(GetResult());  
  7.         }  
  8.   
  9.         GUI.Label(new Rect(200, 0, 200, 50), "測試2:" + result1);  
  10.         if (GUI.Button(new Rect(200, 100, 100, 50), "無協程測試"))  
  11.         {  
  12.             GetResult1();  
  13.         }  
  14.     }  

上面的代碼表示在GUI中定義2個label和按鈕,一個按鈕啓動協程計算,另外一個直接計算結果。因爲2個方法都是計算一樣的結果,計算量比較大,因此直接計算出現了暫時的卡死狀況。spa

 

[csharp]  view plain copy
 
  1. float result;  
  2.     IEnumerator GetResult()  
  3.     {  
  4.         for (int i = 0; i < 1000; i++)  
  5.         {  
  6.             for (int j = 0; j < 100000; j++)  
  7.             {  
  8.                 result += (i + j);  
  9.                   
  10.             }  
  11.             if(i%100==0)  
  12.                 yield return 1;  
  13.               
  14.         }  
  15.     }  

這個方法是協程的寫法,在C#中協程要定義爲IEnumerator 這個類型,javascript中不須要。
.net

yield return 1;這句話表示返回1幀的結果。在i爲100的整數時,就返回一次結果,這樣能夠避免大量的計算卡死。線程

 

 

[csharp]  view plain copy
 
  1. float result1;  
  2.     void GetResult1()  
  3.     {  
  4.         for (int i = 0; i < 1000; i++)  
  5.         {  
  6.             for (int j = 0; j < 100000; j++)  
  7.             {  
  8.                 result1 += (i + j);  
  9.             }  
  10.         }  
  11.     }  

 

 

這個方法就是直接計算結果,因爲運算量比較大,因此界面會卡死,這樣就能夠體現出用協程的好處了。
使用IEnumerator 這個類型時,必須用yield return來返回結果,參數爲數字時表示爲幀數。
如yield return 1 表示每一幀返回一次結果。
3d

相關文章
相關標籤/搜索