騰訊遊戲學院專家:做一個多執行緒遊戲框架可以多簡單?
眾所周知現在各種遊戲終端的發展十分迅猛。其中一個共同的特徵是“多核化”,由此帶來了遊戲開發的“多執行緒化”,但大量的切入點主要集中在引擎層、WorkerThread層。那遊戲邏輯層呢?這裡筆者想通過一個demo來說說遊戲邏輯的多執行緒化,然後再推銷一下它下面的地基GLogic。
這裡我們先定一個小目標:
“一套程式碼,支援各種執行緒模式,開發還很簡單。”
然後我們來看看demo:
https://share.weiyun.com/5zLdeWj
請用Unity2018.2.0f1開啟這個工程。實際上真正有意義的程式碼並不挑Unity版本,只是筆者拖了個UI,所以有相容性問題。
1Demo
1.1命名規範
L代表Logic
M代表Main
N代表Net
執行緒模式裡的LMN、LM_N、L_M_N的含義:
- LMN:LogicMainNet都在一個執行緒裡;
- LM_N:LogicMain在一個執行緒裡,Net在單獨的執行緒裡
- L_M_N:Logic Main Net各自在自己單獨的執行緒裡
1.2 Demo1
開啟Demo1;
選中Entrance節點;
在inspector上選擇執行緒模式;
點選播放按鈕;
在Console視窗下觀察不同;
L_M_N模式下你應該看到這樣的輸出:
LM_N和LMN模式下你應該看到這樣的輸出:
然後,然後這個無聊的demo就完了。那這個無聊的demo到底做了啥?
這個無聊的demo通過兩個類的協同工作來累加一個值,一個是MNumAccSys,另一個是LNumAccSys,他們的字首L或者M代表了我們對它的抽象,L代表了邏輯執行緒,M代表了主執行緒。敏感的同學應該可以意識到筆者這裡想扯的是表現與邏輯分離,但我們這裡還不想展開說。
回來觀察Log都打些什麼:
可以看到在L_M_N模式下,MFrame(主執行緒幀號)第一幀的時候把數值從0加到了1,然後由LFrame(邏輯執行緒幀號)在146幀的時候把這個值從1加到了2。繼續看下去的話會發現這兩個幀號就如同你和你的前男/女友一樣-沒有半毛錢關係;
接著我們看LM_N和LMN模式,會發現這兩個幀號變得如膠似漆-你現男/女友的感覺;
接著你可以繼續跑下去或者編個手機包測試一段時間,觀察有沒有多執行緒崩潰或錯誤。如果沒有,那歡迎感興趣者繼續閱讀。
我們意識到這個demo有這樣一個特點:在不同執行緒模式中維持了相同的時序,所以無論哪個執行緒跑得快慢、多少,執行結果相同。這裡大家敏感的話可以意識到筆者想扯幀同步,沒錯,但是我們這裡也不想馬上展開說。
那我們這個累加邏輯是怎麼實現的呢?
可見我們實際上是在利用訊息機制,在多執行緒的時候是執行緒間非同步通訊,在單執行緒的時候是執行緒內非同步通訊,所以我們的時序可以保證。
同時提一下,整個邏輯的起始,放在了EntranceForDemo1中:
恭喜你,現在你做了個任意執行緒模式下都能跑的遊戲。
1.3 Demo2
如果我們改下程式碼,讓計數只在L層的LNumAccSys計算,而在M層為一個UI.Text控制元件賦值呢(DisplayUIForDemo2)?那恭喜你,你已經做到了任意執行緒模式下的邏輯和表現分離,懶得自己寫的同學請執行Demo2。如果出現Unity版本導致的UI不相容,就請你自己怎麼搞下,筆者就不管了。
Prefab長這樣:
入口在這:
實際邏輯在這:
1.4 Demo3
那如果我們再改下呢?我們加入一個NFakeServerMgr,用於提供每秒一次的邏輯幀驅動。那麼一旦這個NFakeServerMgr變成真Server,頻率變成66毫秒一次,那我們就變成了一個任意執行緒模式、表現邏輯分離的幀同步遊戲了。仍然懶得自己寫的同學就請執行Demo3。
模擬幀同步伺服器:
示例幀同步客戶端:
1.5 Demo4
那如果我們再繼續猛烈的改一下呢?資料分離,加入實體,XXXSys…呢?恭喜你,你已經有了一個任意執行緒模式、表現邏輯分離、ECS的幀同步遊戲了…。懶得寫的同學也自己去寫,這麼多程式碼已經超過了Demo的容量。
1.6本文Demo裡沒說的東西
你可能注意到了FakeObjPoolMgr是假的。
這裡只描述一下該寫什麼東西:你需要有一個多執行緒自釋放物件池。
其實LogUtil也值得你看下。
其實筆者本身在這個GLogic上做的東西遠不止文中所提及的內容,大家請發揮想象力。
2 GLogic是什麼?
你說了這麼多,這GLogic到底是啥?
限於篇幅我們這裡簡單說說裡面最基本的一些概念,其它更深層的用法請大家自己閱讀程式碼吧,別擔心,裡面有充足的註釋。
基本上GLogic作為一個邏輯框架,提供了兩個東西:
- 時序控制
- 訊息機制
它通過實現一個叫做“邏輯樹”的概念來達成以上兩點。
2.1邏輯樹
a)邏輯樹由邏輯節點互相掛接組成,邏輯節點是一個實現了IGLogicNode介面的類;邏輯樹的掛接形態是時序的基礎;
b)IGEvent和IGEventListener分別作為訊息和訊息監聽器的介面,提供了在邏輯樹中監聽訊息的能力;
c)邏輯樹的根節點一般稱為LogicCore,本身仍然是一個邏輯節點,但額外擔負了迴圈入口的重擔;
d)邏輯樹之間的相互掛接實現了上面各Demo中的任意執行緒模式切換。
2.2時序控制
樹狀結構,深度優先遍歷。
圖中弧線表示預設執行順序,本執行順序可通過“節點優先順序”進行深度定製。
2.3訊息機制
a)層級訊息廣播
可見在不同層級上丟擲的訊息,它的輻射面是不同的。本順序可以通過“訊息優先順序”進行深度定製。
b)訊息監聽
根據我們的廣播原理,各Sys都將監聽到Event1和Event2,但Event1的廣播量明顯有浪費。
c)同步及非同步訊息
各Sys會立即收到Event1,而Event2則會在下一幀收到。
d)執行緒安全
Bridge是一個執行緒安全節點,這樣另一個執行緒就能安全的在它上面丟擲Event1。各Sys將在ThreadA的時序內收到Event1,無需擔心執行緒安全問題。
2.4其他
a)訊息攔截,在HandleEvent中返回true來阻止訊息繼續廣播。這個特性在非同步Job分配、負載控制、loading攔截輸入等場景尤其便利。
b)節點優先順序、訊息監聽優先順序,決定了節點的執行順序及收到訊息的順序,這個機制在動態啟動高優先順序邏輯、資料池優先於所有邏輯感知資料變化等場景尤其便利。
c)C++版本?GLogic有適用於Unreal4的C++版本,邏輯思想類似,大家可以自行改造。
綜述
說這麼多,筆者無非想表達一個意思:希望GLogic能幫助你在當下多核裝置環境中搭建高效能、高靈活度的遊戲框架。
使用程式碼的話請保留作者宣告。
關於騰訊遊戲學院專家團
如果你的遊戲也富有想法充滿創意,如果你的團隊現在也遇到了一些開發瓶頸,那麼歡迎你來聯絡我們。騰訊遊戲學院聚集了騰訊及行業內策劃、美術、程式等領域的遊戲專家,我們將為全世界的創意遊戲團隊提供專業的技術指導和遊戲調優建議,解決團隊在開發過程中遇到的一系列問題。
專案指導合作請聯絡微信:18698874612
來源:騰訊GWB遊戲無界
原地址:https://mp.weixin.qq.com/s/Flj7jmk85xXwKc55DGZnfw
相關文章
- 多執行緒搶沙包遊戲執行緒遊戲
- 用Python做遊戲有多簡單?Python遊戲
- 騰訊遊戲學院專家:如何避免出海遊戲伺服器水土不服?遊戲伺服器
- 騰訊遊戲學院專家帶你快速瞭解PBR遊戲
- Crash率10%降至1%,騰訊遊戲學院專家是這樣打磨遊戲的遊戲
- 騰訊遊戲學院專家教你七步做數值遊戲
- 一日一技:用Python做遊戲有多簡單Python遊戲
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- 騰訊遊戲學院專家眼中,是如何看待遊戲設計時常遇見的三個問題遊戲設計
- “生命遊戲”的多執行緒演算法思考遊戲執行緒演算法
- java多執行緒系列:通過對戰遊戲學習CyclicBarrierJava執行緒遊戲
- 斷線卡頓怎麼辦?騰訊遊戲學院專家談網路遊戲同步技術遊戲
- 騰訊遊戲學院專家例項剖析:如何優化休閒遊戲的美術風格?遊戲優化
- 騰訊遊戲學院專家:UE高階效能剖析技術之RHI遊戲
- 省頻寬、耗電小,騰訊遊戲學院專家解析手遊渲染架構遊戲架構
- 多執行緒學習一(多執行緒基礎)執行緒
- 騰訊遊戲學院專家:如何延長玩家遊戲時間,並調動玩家二次創作?遊戲
- 簡易多執行緒爬蟲框架執行緒爬蟲框架
- 打造獨立遊戲孵化新模式,騰訊遊戲學院助力遊戲多元發展遊戲模式
- 騰訊遊戲學院專家:手遊開發,該如何做好Android記憶體優化?遊戲Android記憶體優化
- 騰訊遊戲學院專家:PBR渲染模型的理論及具體應用遊戲模型
- Java多執行緒學習——執行緒通訊Java執行緒
- UGC遊戲浪潮(三)做一個UGC遊戲與在UGC做一個遊戲GC遊戲
- ObjC 多執行緒簡析(一)-多執行緒簡述和執行緒鎖的基本應用OBJ執行緒
- Golang多執行緒簡單鬥地主Golang執行緒
- 【框架】一種通知到多執行緒框架框架執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- 多執行緒學習一執行緒
- 騰訊遊戲2024釋出會:逾30款產品及多個遊戲科技專案釋出最新進展遊戲
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- java多執行緒 wait() notify()簡單使用Java執行緒AI
- Python簡單實現多執行緒例子Python執行緒
- Java多執行緒就是這麼簡單Java執行緒
- Java多執行緒學習(八)執行緒池與Executor 框架Java執行緒框架
- Java多執行緒-執行緒通訊Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 從單專案研發到多專案並行,這家遊戲公司是如何做到的?並行遊戲