FishMan優化教程 01 多線程

1.問題&挑戰

在相對大型的遊戲中,總是會碰到需要CPU佔用時間長的任務,爲了避免卡頓,可能需要進行分幀處理,在Unity中通常使用協程,但是需要協程本質上也是運行在主線程中,它依然會佔用大量的主線程時間分片.
1.遊戲的很多邏輯都是基於單線程開發的,所以使用多線程的時候,任務完成時,回調必須在主線程中回調,不然容易引起線程安全的問題。
2.遊戲的有時候常常必須運行在主線程中,如需要使用實例化GameObjec,需要創建新的遊戲資源如Texture,Mesh等,這些在Unity中必須運行在主線程中.
3.任務有時候需要中斷,如一些先決條件的改變
4.如果我們的遊戲是幀同步遊戲,爲了保證邏輯的一致,有些任務所有客戶端都必須在同一個邏輯幀中完成。而這就要求其不能運行在其他線程。
5.當然主線程不能被掛起,否則遊戲就卡死了.
6.遊戲中不能到處充滿Lock,Unlock的代碼,不然維護成本過高

所以線程框架必須具備以下幾個特點:

  1. 任務完成時候的回調必須在主線程中。
  2. 任務的某些階段必須可以在主線程中運行
  3. 任務可以被取消
  4. 有些任務必須只能在當前幀中完成
  5. 主線程不能被其他線程給掛起
  6. 性能要好,因爲引入多線程的原因就是爲了性能

2.設計

基於上述幾個需求:

1.在沒有任務的情況下,那些線程不應該佔用CPU時間分片,所以應該被掛起。
需要使用信號量實現
2.我們擁有兩種不同的運行環境,主線程和非主線程,但是爲了同時滿足上面的需求1,2需要一個運行在主線程的MainQueue,多線程本身就要求擁有一個運行在其他線程的AnyThreadQueue,需求4,所以我們還需要一個CurFrameQueue,這些隊列都必須是線程安全的,所以必須加鎖
而BlockQueue可以很好的滿足上面的加鎖和信號量的需求
3.//TODO

3.源代碼:

4.其他:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章