主題

【雜亂 學習筆記】Async vs Coroutine,又亂挖坑的開始亂學

趴趴鼠Loading | 2020-11-28 20:51:59

前言:
想做個排程工具,不是那種"系統排程"工具,而是給遊戲怪物AI用的。最近在搞怪物AI,隨著動作越來越多,若每個動作都分開判斷執行,這樣加一堆鎖也不夠,再來是Unity 2D animator也很奇怪,在3D上的smooth轉換是很漂亮,但2D完全就變成個累贅,動畫都沒播完就轉換下一個

C# 的Task又是另一個世界,但因為一下接觸太多新資訊,所以開個創作邊學邊紀錄自己蠢蠢的實驗。



Async 和 Unity Coroutine的差別:


來源(裡面有程式碼比對)

  • Async是C#的東西,生命週期要自己控制。 Coroutine是Unity的東西,生命週期綁在MonoBehavior上,若在Coroutine結束前刪掉啟動它的MonoBehavior物件會報錯,所以重要的Coroutine我會用單例物件去啟動。
  • Async不用Unity引擎也能存在。 (如下圖所示,遊戲都沒在play了,沒收掉的Async還是會跑)
  • 根據這串討論,Coroutine適合以frame為基準執行的動作(例如移動),Async適合用在工作排程。
  • 來源影片
  • Async沒管控好會造成memery leaks,而且線程很珍貴,用太多很浪費,可用yield舒緩。 Coroutine則比較沒有記憶體的問題。





Action 和 Task

這著這個參考做,不知道為什麼第17、18行不會執行,只有第19行會。
結果:


但若是在裡面用await Task.Run卻又會執行:



另外這篇文章有比較 Func , Action 和 Task。




Task.WhenAll 等待Task跑完

結果:
值得注意的是,taskWhenAll並沒有等DoLog()裡面的1秒,只有等Task3的3秒。
參考文章(裡面有比較whenAll和waitAll,結論是whenAll執行時間比較短)。
還有另外一個是whenAny,傳入的任一task完成即可。

弄成陣列是一樣的效果


題外話,若這樣打:
會出現這個error:
我計概沒讀很好,大概的理解是DoSth是Task.Run的時候分出去的thread吧。

前置概念大概這樣吧,我再研究研究,也許最近都會是這種主題的東西
124 巴幣: 12
教授加博士先生
這部分建議可以稍微學點,畢竟unity還是coroutine主流中XD unity又打算自己搞ECS, 這個應該還是會一直小邊緣的
2020-11-28 22:55:51
教授加博士先生
另外你的Start也要Async 整個病毒感染下去
2020-11-28 23:17:34
教授加博士先生
基本官方微軟學完 如果Unity想實戰用 有要寫Steamworks的話 我會推薦Facepunch https://github.com/Facepunch/Facepunch.Steamworks 裡面都是Async Await夠熟悉
2020-11-28 23:21:21
教授加博士先生
(個人士推薦去把微軟你一大票文章例子都看一看 (左邊測欄位Async Programming) 就差不多ㄌ 其他很多來源不明的都亂寫亂教= =
2020-11-28 23:23:18
御安鴨鴨
謝謝你分享寶貴的知識,祝你的肝一生平安
2020-11-29 00:27:16

更多創作