日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

U3D的飞船太空射击例子中,使用coroutine

發布時間:2025/3/17 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。