首頁>Club>
6
回覆列表
  • 1 # 水母星人

    從字面上看,協程與執行緒、程序較為相似,對於擁有其它開發語言基礎的同學容易造成困擾,以至於第一印象把協程理解成執行緒。

    執行緒是作業系統能夠進行運算排程的最小單位,分配算力、執行排程以執行緒為單位。一條執行緒指就是一個單一順序的控制流。

    程序是正在執行的程式的例項,是執行緒集合的載體,同時也是作業系統分配資源的基本單位。

    執行緒和程序的關係,打個比方,一個應用程式就是一個程序。程序啟動後,好比建立了一個工廠,執行緒是這個工廠中的“流水線”。一個工廠內可以有多個流水線,這些流水線可以併發生產,一條流水線出問題不會影響其它流水線。所以,程序可以有多個執行緒,但至少有一個主執行緒。

    執行緒間可以併發執行,並共享程序資源(都使用程序的空間)。執行緒間有獨立的棧區,但共享使用程序的堆區。

    Unity中不支援多執行緒開發,但是卻有併發的需求,使用協程來模擬多執行緒開發,即可併發(模擬),又可控制同步、防止阻塞。

    協程是Unity機制,不具備系統普遍性,只能在MonoBehaviour下啟動。 協程和執行緒的定義、啟動流程類似,但其內部實現原理與執行緒不同。

    ------------------這裡開始介紹協程-----------------------------

    Unity的協程系統是基於C#的一個簡單而強大的介面,簡單講就是可以把一個方法拆分成多次執行的一種介面。協程透過yiled return返回一個迭代器,記錄程式執行的位置,之後進入阻塞狀態,直到滿足喚醒條件後,才會繼續向下執行。啟動多個協程後,多個協程之間不會真正的併發,而透過快速輪詢模擬併發效果。

    Unity在整個生命週期中構建了一個託管程式碼執行佇列,透過生命週期管理器往這個佇列中新增執行方法的委託,然後啟動一個託管執行緒,這個執行緒中不斷的迴圈獲取佇列中的方法委託並執行。

    當開啟一個迭代器(IEnumerator)後,協同程式便開始執行,在執行到yield return 之前和一般的程式沒有任何區別,遇到yield return 之後立即返回,並將之後的程式碼掛起。之後判斷yield return後邊的條件是否滿足,如果滿足,向下繼續執行,否則繼續等待。

    IEnumerator methodName(Object parameter1,Object parameter2,...){

    // to do something

    yield return Yield Instruction/other/null;

    // to do something else

    }

  • 中秋節和大豐收的關聯?
  • 大資料的框架主要學習和使用什麼呢?