C#知識點講解之進程,線程,Unity協程的愛恨情仇

今天來講一講《進程,線程,Unity協程的愛恨情仇》

前方乾貨預警,非戰鬥人員請儘快撤離!

進程process,線程thread,協程coroutine

一、一句話總結:
一般一個應用程序一個進程。一個進程有一個主線程和多個輔助線程,你可以在線程上開啓多個協程。

進程有自己獨立的棧和堆
線程有自己獨立的棧和共享堆
協程有自己獨立的棧和共享堆

二、協程和線程的區別:
在執行效率上:就比如說線程ta和線程tb,執行完成各需要10s
1、在單核os中,用的是僞並行,a走一下,掛起,b走一下。中間切換時間0.1s。
那麼單核中ta和tb執行完需要10+10+19*0.1=21.9s
而協程就是10+10=20s
2、在多核os中,線程真並行,只要10s
而協程仍然需要10+10=20s
總結:在多核os中,同一時間可以執行多個線程,但同一時間只能執行一個協程。cpu對協程的請求也是一個一個來的。

其他方面:
1、開啓一個線程的開銷比一個協程大,線程是os級別的概念,協程是編輯器級別的,實現由程序員自己實現
2、線程用於多個關聯性不強的工作,而協程主要用於將一個工作分時間片處理。
3、協程執行代碼,在yiled之前的跟其他方法沒有區別。之後的掛起等待。生命週期大部分都在update和lateupdate之間(個別除外),也就是掛起時每幀都會去看下有沒有滿足yiled後的條件。
4、Unity中,除主線程外,其他線程無權訪問Unity3D的組件、對象和Unity3D系統調用,如果要使用的化, 需要把組件中的數值傳到開啓的新線程中。

三、Unity是單線程的,避免多線程引發bug不好查找,但Unity是可以支持多線程的,如果同時要處理很多事情或者與Unity對象互動小的可以用thread,否則用coroutine。
C#中的lock關鍵字
,可用於確保只有一個線程可以在特定事件內訪問特定的對象。

下附協程常使用的內容:

yield return null; 下一幀再執行後續代碼
yield return 0; 下一幀再執行後續代碼
yield return 6;(任意數字) 下一幀再執行後續代碼
yield break; 直接結束該協程的後續操作
yield return asyncOperation;等異步操作結束後再執行後續代碼
yield return StartCoroution(/*某個協程*/);等待某個協程執行完畢後再執行後續代碼
yield return WWW();等待WWW操作完成後再執行後續代碼
yield return new WaitForEndOfFrame();等待幀結束,等待直到所有的攝像機和GUI被渲染完成後,在該幀顯示在屏幕之前執行
yield return new WaitForSeconds(0.3f);等待0.3秒,一段指定的時間延遲之後繼續執行,在所有的Update函數完成調用的那一幀之後(這裏的時間會受到Time.timeScale的影響);
yield return new WaitForSecondsRealtime(0.3f);等待0.3秒,一段指定的時間延遲之後繼續執行,在所有的Update函數完成調用的那一幀之後(這裏的時間不受到Time.timeScale的影響);
yield return WaitForFixedUpdate();等待下一次FixedUpdate開始時再執行後續代碼
yield return new WaitUntil()將協同執行直到 當輸入的參數(或者委託)爲true的時候....:yield return new WaitUntil(() => frame >= 10);
yield return new WaitWhile()將協同執行直到 當輸入的參數(或者委託)爲false的時候....:yield return new WaitWhile(() => frame < 10);
yield return X>5;等待變量x大於5時再執行後續代碼
yield return transform.position.y<0;等待物體的高度小於0時再執行後續代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章