U3D的飞船太空射击例子中,使用coroutine
生活随笔
收集整理的這篇文章主要介紹了
U3D的飞船太空射击例子中,使用coroutine
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
coroutine
?
線程是操作系統級別的概念,現代操作系統都實現并且支持線程,線程的調度對應用開發者是透明的,開發者無法預期某線程在何時被調度執行。基于此,一般那種隨機出現的BUG,多與線程調度相關。
coroutine則是一個概念,windows上有所謂的fiber纖程實現,而好些語言中也自帶coroutine的實現,比如Lua。與線程最大的不同是,coroutine的調度/掛起/執行開發者是可以控制的。另外coroutine也比線程輕量的多。要在語言層面實現coroutine,需要內部有一個類似棧的數據結構,當該coroutine被掛起時要保存該coroutine的數據現場以便恢復執行。 ------------------------------------------------------------------------------------------?
原理探析
- coroutine創建的所謂的“線程”都不是真正的操作系統的線程,實際上是通過保存stack狀態來模擬的。
- 由于是假的線程,所以切換線程的開銷極小,同時創建線程也是輕量級的,new_thread只是在內存新建了一個stack用于存放新coroutine的變量,也稱作lua_State
- 調用yield()當前線程交出控制權,同時還可以通過stack返回參數。調用resume的線程(可理解為主線程)獲得返回的參數。
- Lua yield()和Java中的Thread.yield()有點相似,但是區別更大。Java中的yield調用后只是將當前CPU切換到另外一個線程,CPU可能隨時會繼續回到線程執行。
- 我更傾向于把Lua中的yield()和resume()和Java中的wait()和notify()來對比。它們表現的行為基本一致。
Why coroutine?
上面對coroutine有個基本的了解,因此大家都會象我一樣去想,為什么要用coroutine?先研究下優點
- 每個coroutine有自己私有的stack及局部變量。
- 同一時間只有一個coroutine在執行,無需對全局變量加鎖。
- 順序可控,完全由程序控制執行的順序。而通常的多線程一旦啟動,它的運行時序是沒法預測的,因此通常會給測試所有的情況帶來困難。所以能用coroutine解決的場合應當優先使用coroutine。
總結
以上是生活随笔為你收集整理的U3D的飞船太空射击例子中,使用coroutine的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET的错误处理机制之二(实例l
- 下一篇: ORA-01919: role 'OLA