Unity3D中的執行緒與協程

2022-08-19 06:24:15 字數 2078 閱讀 6010

unity3d是以生命週期主線程迴圈進行遊戲開發。

unity3d中的子執行緒無法執行unity sdk(開發者工具包,軟體包、軟體框架)跟api(應用程式程式設計介面,函式庫)。

限制原因:大多數遊戲引擎都是主迴圈結構,遊戲中邏輯更新和畫面更新的時間點要求有確定性,必須按照幀序列嚴格保持同步,否則就會出現遊戲中的物件不同步的現象。雖然多執行緒也能保證這個效果,但是引用多執行緒,會加大同步處理的難度與遊戲的不穩定性。

但是多執行緒也是有好處的,如果不是畫面更新,也不是常規的邏輯更新(指包括ai、物理碰撞、角色控制這些),而是一些其他後台任務,比如大量耗時的資料計算、網路請求、複雜密集的i/o操作,則可以將這個獨立出來做成乙個工作執行緒,這需要寫unity遊戲的native擴充套件。

對於unity3d,它是生命週期主線程迴圈的設計,它更傾向於使用time slicing(時間分片)的coroutine(協程)去完成非同步

任務,融合到生命週期中。

執行緒是作業系統級別的概念,現代作業系統都支援並實現執行緒,執行緒的排程對應用開發者是透明的,開發者無法預期某執行緒在何時被排程執行。基於此,一般那種隨機出現的bug,多與執行緒排程相關。

而協程coroutine是編譯器級別的,本質是乙個執行緒時間片去執行**段。它通過相關的**使得**段能夠實現分段式的執行,顯式呼叫yield函式後才被掛起,重新開始的地方是yield掛起的位置,每一次執行協程會跑到下乙個yield語句。協程能保留上一次呼叫時的狀態(即所有區域性狀態的乙個特定組合),每次過程重入時,就相當於進入上一次呼叫的狀態,換種說法:進入上一次離開時所處邏輯流的位置。

在unity3d中,協程是可自行停止執行 (yield),直到給定的 yieldinstruction 結束再繼續執行的函式。協程 (coroutines) 的不同用途: ·

(1) yield return null - 這一幀到此暫停,下一幀再從暫停處繼續,常用於迴圈中。

(2) yield return new waitforendofframe - 等到這一幀的cameras和gui渲染結束後再從此處繼續,即等到這幀的末尾再往下執行。這行之後的**還是在當前幀執行,是在下一幀開始前執行,跟return null很相似。

(3) yield return new waitforfixedupdate - 在下一次執行fixedupdate的時候繼續執行這段**,即等一次物理引擎的更新。

(4) yield return new waitforseconds(3.0f) - 等待3秒,然後繼續從此處開始,常用於做定時器。

(6) yield return startcoroutine(methodname) - 等待另乙個協程執行完。這是把協程串聯起來的關鍵,常用於讓多個協程按順序逐個執行。

(7)yield break - 直接跳出協程,對某些判定失敗必須跳出的時候,比如載入assetbundle的時候,www失敗了,後邊載入bundle沒有必要了,這時候可以yield break跳出。

值得注意的是 waitforseconds()受time.timescale影響,當time.timescale = 0f 時,yield return new waitforsecond(x) 將不會滿足。

以下為unity3d的生命週期迴圈圖

c#**示例

unity3d使用協程常需要用到輔助類

stopwatch

,提供一組可用於準確地測量執行時間的方法和屬性。

private stopwatch framestopwatch;//

用來記錄上一幀結束到現在所用的時間

private

float targetframeduration;//

自定義的每幀持續時間,防止協程過度消耗執行緒時間片

private

void

awake()

void

update()

}privateienumerator processchunkqueueloop()}}

引用:(1)

遊戲引擎unity中的單執行緒與多執行緒

其他:(1)遊戲主迴圈

(2)3d引擎多執行緒:渲染與邏輯分離

Unity3d多執行緒

一 多執行緒的建立 thread t new thread new threadstart go thread t1 new thread go 兩種建立方式沒有區別 二 多執行緒的狀態控制和優先順序 多執行緒有4種狀態 start 開始 abort 終止 join 阻塞 sleep 休眠 有5種優...

Unity3d多執行緒

一 多執行緒的建立 thread t new thread new threadstart go thread t1 new thread go 兩種建立方式沒有區別 二 多執行緒的狀態控制和優先順序 多執行緒有4種狀態 start 開始 abort 終止 join 阻塞 sleep 休眠 有5種優...

Unity中的協程

1.建立協程 迭代器 ienumerator private ienumerator test 裡面可以使用 yield return new waitforsecond 1 等待1s後執行後面的 yield return new waitforseconds 0.3f 等待0.3秒,一段指定的時間...