Unity冷知識:async/await Task的用法限制和解決

冷知識1:Unity API不是線程安全的
因此,你應(yīng)該只在UnitySynchronizationContext中使用async和await Task;
異步Task經(jīng)常在被調(diào)用時(shí)分配對象,如果過度使用,可能會導(dǎo)致性能問題。
冷知識2:如果要使用異步任務(wù),你必須:
使用手動創(chuàng)建和處理自己的線程Task.RunAPI
使用默認(rèn)的SynchronizationContext而不是Unity版本
Unity會用自定義的UnitySynchronizationContext覆蓋默認(rèn)的SynchronizationContext,它在主線程上運(yùn)行所有的Task(不管是Editor模式還是Play模式下)
冷知識3:Unity不會自動停止運(yùn)行在托管線程(主線程)上的異步Task,因此必須:
監(jiān)聽Play模式的進(jìn)入和退出(通過EditorApplication.playModeStateChanged事件委托)
如果這么做了,Unity的腳本API在切換回UnitySynchronizationContext之前,都是不可用的!
關(guān)于這個(gè)問題和解決方案可參考我的《原神游戲開發(fā)》日志:https://www.bilibili.com/video/BV1LA411Q7AN/?spm_id_from=333.999.0.0
冷知識4:在development build打包模式下,在非托管線程運(yùn)行UnityAPI,會看到如下報(bào)錯:
冷知識5:出于性能考量,在不采用development build模式打包時(shí),Unity不會報(bào)上述錯誤,但會因多線程問題造成程序隨機(jī)崩潰或未知錯誤!
因此,Unity建議不要在腳本中使用多線程,除非……
冷知識6:要安全的使用多線程,并享受其帶來的性能優(yōu)勢,可以使用Unity的Job System
關(guān)于Job System的原理和用法,可參考我的技術(shù)詳解:https://www.bilibili.com/video/BV1yA411Y7ou/?spm_id_from=333.999.0.0