比如用A*算法計算場景中的大量數據,在變形的網格中操縱大量頂點,不斷進行上傳數據到服務器、識別二維碼等圖像處理。如果要同時處理很多事情或者和Unity對象交互很少,可以用thread,否則可以用coroutine。
線程是程序中與其他線程同時運行的進程。多線程的真正同步可以在多處理器計算機上實現,更多的線程依賴於擁有多個處理核心。
在Unity3D編程中,總是有壹個主線程來執行您的代碼,或者您可以創建額外的線程與主線程同時運行。在Unity中,只能從主線程訪問Unity3D組件、對象和Unity3D系統調用。任何試圖訪問這些項目的第二個線程都將失敗並導致錯誤,這是壹個需要註意的限制。
所以當妳寫代碼的時候,妳認為壹個函數在到達執行點之後開始並返回。同樣,妳做的事情在另壹個函數中執行,但是沒有相應的變化。操作系統決定代碼的執行。任何時候,妳的代碼只能暫時“休眠”,然後讓另壹個代碼開始運行。
Unity3D中的多線程及其使用
在這個例子中,在第壹個線程將A的值加載到CPU寄存器以準備+1之後,它被中斷。第二個線程讀取A的值並減去1000。這個時候A應該是-950。現在第壹個線程又開始了,它在寄存器中的結果50+1存放在A中,A變成了56540。
從根本上說,當多個線程同時訪問變量或內存時,應該采取許多預防措施來確保這種情況不會發生。所以Unity決定從另壹個線程訪問這些變量或內存是無效的,只是為了避免所有系統和框架對象出現問題。所以要確保壹次只有壹個線程可以修改變量。這並不意味著您不能使用多線程。妳可以通過“排序”來解決這個問題。
C#中有壹個關鍵字lock,確保在特定的時間只有壹個線程可以訪問特定的對象。方法來鎖定值類型或基元。
int a = 50
object guard =新對象();
void ThreadOneCode()
{
//這裏有壹些代碼。
鎖(防護裝置)
{
a = a+1;
}
//剩下的代碼在這裏。
}
void ThreadTwoCode()
{
//這裏有壹些代碼。
鎖(防護裝置)
{
a = a-1000;
}
復制代碼
所有東西都被鎖定在guard中,因此壹次只有壹個線程可以通過guard訪問它,並且您可以使用任何合適的對象。現在妳可能有各種各樣的問題,比如妳想鎖的東西不止壹個,可能是互相嵌套的。那麽我們該怎麽辦呢?
我們的類叫做Loom,讓妳在另壹個線程中運行代碼變得很容易。有兩個功能需要註意:
RunAsync(Action)-在另壹個線程上運行的壹組代碼。
QueueOnMainThread(Action,[可選]float time)-在主線程中運行的語句(可選delay)。
帶織機的通道織機。current-創建壹個不可見的GameObject來處理遊戲主線程的交互。以下示例使用Loom更新網格的所有頂點乘法結果。
//在第二個線程中縮放壹個網格。
復制代碼