http://blog.163.com/hj_0467/blog/static/74252563201011711845180/
http://wg2009perfect.blog.163.com/blog/static/127997663201211111222126/
我在這摘要下:
1.
coroutine,中文翻譯“協程”。這個概念可能有點冷門,不過百度之,說是一種很古老的編程模型了,以前的操作系統里進程調度里用到過,現在操作系統的進程調度都是根據時間片和優先級來進行輪換,以前是要程序自己來釋放cpu的控制權,一直不釋放一直也就占用着cpu,這種要求程序自己來進行調度的編程模型應該就叫“協程”了。
協程和線程差不多,線程的調度是由操作系統完成的,協程把這項任務交給了程序員自己實現,當然也就可以提高靈活性,另外協程的開銷比線程要小,在程序里可以開更多的協程。
一些語言里自帶了對coroutine的實現,比如lua。c里面雖然沒有coroutine,不過windows下提供了一種叫fiber的機制,叫做“纖程”,算是一種輕量級線程。
2.
一。什么是協同程序
協同程序,即在主程序運行時同時開啟另一段邏輯處理,來協同當前程序的執行。換句話說,開啟協同程序就是開啟一個線程。
二。協同程序的開啟與終止
在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可開啟一個協同程序,也就是說該方法必須在MonoBehaviour或繼承於MonoBehaviour的類中調用。
在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以開啟一個線程。區別在於使用字符串作為參數可以開啟線程並在線程結束前終止線程,相反使用IEnumerator 作為參數只能等待線程的結束而不能隨時終止(除非使用StopAllCoroutines()方法);另外使用字符串作為參數時,開啟線程時最多只能傳遞一個參數,並且性能消耗會更大一點,而使用IEnumerator 作為參數則沒有這個限制。
在Unity3D中,使用StopCoroutine(string methodName)來終止一個協同程序,使用StopAllCoroutines()來終止所有可以終止的協同程序,但這兩個方法都只能終止該MonoBehaviour中的協同程序。
還有一種方法可以終止協同程序,即將協同程序所在gameobject的active屬性設置為false,當再次設置active為ture時,協同程序並不會再開啟;如是將協同程序所在腳本的enabled設置為false則不會生效。這是因為協同程序被開啟后作為一個線程在運行,而MonoBehaviour也是一個線程,他們成為互不干擾的模塊,除非代碼中用調用,他們共同作用於同一個對象,只有當對象不可見才能同時終止這兩個線程。然而,為了管理我們額外開啟的線程,Unity3D將協同程序的調用放在了MonoBehaviour中,這樣我們在編程時就可以方便的調用指定腳本中的協同程序,而不是無法去管理,特別是對於只根據方法名來判斷線程的方式在多人開發中很容易出錯,這樣的設計保證了對象、腳本的條理化管理,並防止了重名。
Unity3D之協程(Coroutines & Yield )
http://blog.csdn.net/jjiss318/article/details/7447421
這有些個國外的人解釋的,算是比較清楚,只是還是沒有原理上的解釋:
http://www.blog.silentkraken.com/2010/01/23/coroutines-in-unity3d-c-version/
http://blog.equals-equals.com/2009/11/18/tutorial-coroutines-pt-1-waiting-for-input/
我的一些粗淺小結:
1.Coroutines顧名思議是用來協助主要進程的,在Unity中感覺就是一個可動態添加和移除的Update()函數。它的調用在所有Update函數之后。
Unity原文:
- If you start a coroutine in LateUpdate it will also be called after LateUpdate just before rendering.
- Coroutines are executed after all Update functions.
2.yield就像是一個紅綠燈,在滿足緊跟在它后面的條件之前,這個協程會掛起,把執行權交給調用它的父函數,滿足條件時就可以執行yield下面的代碼。
Unity原文:
Coroutine
Normal coroutine updates are run after the Update function returns. A coroutine is function that can suspend its execution (yield) until the given given YieldInstruction finishes. Different uses of Coroutines:
- yield;The coroutine will continue after all Update functions have been called on the next frame.
- yield WaitForSeconds(2);Continue after a specified time delay, after all Update functions have been called for the frame
- yield WaitForFixedUpdate();Continue after all FixedUpdate has been called on all scripts
- yield WWWContinue after a WWW download has completed.
- yield StartCoroutine(MyFunc); Chains the coroutine, and will wait for the MyFunc coroutine to complete first.
