關於StartCoroutine的簡單線程使用


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

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

使用線程的好處就是不會出現界面卡死的情況,如果有一次非常大量的運算,沒用線程就會出現假死的情況。

下面通過一個簡單的例子來說明使用協程的好處:

 

 

[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個方法都是計算同樣的結果,計算量比較大,所以直接計算出現了暫時的卡死情況。

 

[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中不需要。

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 表示每一幀返回一次結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM