當前位置:成語大全網 - 書法字典 - Unitysocketio在unity3d中需要使用多線程嗎?

Unitysocketio在unity3d中需要使用多線程嗎?

Unity3D中的多線程。線程化是壹個非常復雜的話題,但是如果妳掌握了它,妳就可以使用多個硬件處理器或者處理難以劃分的管理數據塊。

比如用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更新網格的所有頂點乘法結果。

//在第二個線程中縮放壹個網格。

復制代碼