對 Unity 避免使用多線程的調研


1. 為什么避免使用多線程 #

在知乎上看到過這段話

但是 Unity 為什么一般避免使用多線程, 實際上大多數游戲引擎也都是單線程的, 因為大多數游戲引擎是主循環結構, 邏輯更新和畫面更新的時間點要求有確定性, 如果在邏輯更新和畫面更新中引入多線程, 就需要做同步而這加大了游戲的開發難度, 尤其是對編程關卡的程序猿而言. 所以需要異步功能的時候, 游戲引擎總是傾向於使用 Time-Slicing 的策略而不是使用多線程, Unity 中的協程 (coroutine) yield 語法的本質就是 Time-Slicing.

Unity 的函數執行機制是幀序列調用,甚至連 Unity 的協程 Coroutine 的執行機制都是確定的,如果可以使用多線程訪問 UnityEngine 的對象和 api 就得考慮同步問題了,也就是說 Unity 其實根本沒有多線程的機制,協程只是達到一個延時或者是當指定條件滿足是才繼續執行的機制。

Unity 引擎的類都不是線程安全的(Mathf 不是類);Unity 沒有自帶的多線程解決方案,協程是假的多線程,本質還是單線程;

2. 存在使用多線程的時候 #

但是多線程也是有好處的, 如果不是畫面更新, 也不是常規的邏輯更新 (指包括 AI | 物理碰撞 | 角色控制這些), 而是一些其他后台, 比如網絡傳輸, 則可以將這個獨立出來做成一個工作線程, 這需要寫 Unity 游戲的 Native 擴展.

也就是說 Unity 開發過程中有使用多線程的時候, Unity 可以使用多線程,但對其有很多限制,也就是 在不使用 UnityEngine API 的情況下,可以使用多線程,提高多核 CPU 的使用率。而提到多線程就要提到 Unity 非常常用的協程,然而協程並非真正的多線程。協程其實是等某個操作完成之后再執行后面的代碼,或者說是控制代碼在特定的時機執行。而多線程在 Unity 渲染和復雜邏輯運算時可以高效的使用多核 CPU,幫助程序可以更高效的運行。通常可以將需要大量計算的算法內容,放置到多線程中執行,包括邏輯框架也可以放到多線程中執行。

Unity 使用多線程注意

1. 變量都是共享的(都能指向相同的內存地址)
2. UnityEngine 的 API 不能在分線程運行
3. UnityEngine 定義的基本結構(int, float, struct 定義的數據類型)可以在分線程計算,如 Vector3(struct)可以, 但 Texture2d(class,根父類為 Object) 不可以。
4. UnityEngine 定義的基本類型的函數可以在分線程運行

3. 參考來源 #

https://zhidao.baidu.com/question/1927250192416022867.html
http://dsqiu.iteye.com/blog/2028503
http://www.phpstudy.net/b.php/91487.html

End.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM