日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...

發(fā)布時間:2024/9/19 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

導(dǎo)語 如何做一個多線程游戲框架?騰訊游戲?qū)W院專家Tao將在本文通過一個demo來說說游戲邏輯的多線程化。

眾所周知現(xiàn)在各種游戲終端的發(fā)展十分迅猛。其中一個共同的特征是"多核化",由此帶來了游戲開發(fā)的"多線程化",但大量的切入點主要集中在引擎層、WorkerThread層。那游戲邏輯層呢?這里筆者想通過一個demo來說說游戲邏輯的多線程化,然后在推銷一下它下面的地基GLogic。

這里我們先定一個小目標(biāo):

"一套代碼,支持各種線程模式,開發(fā)還很簡單"

然后我們來看看demo:

https://share.weiyun.com/5zLdeWj

請用Unity2018.2.0f1打開這個工程。實際上真正有意義的代碼并不挑Unity版本,只是筆者拖了個UI,所以有兼容性問題。

命名規(guī)范

· L 代表 Logic

· M 代表 Main

· N 代表 Net

· 線程模式里的LMN、LM_N、L_M_N的含義

· LMN:LogicMainNet都在一個線程里;

· LM_N: LogicMain在一個線程里,Net在單獨的線程里

· L_M_N:Logic Main Net各自在自己單獨的線程里

Demo1

打開Demo1;

選中Entrance節(jié)點;

在inspector上選擇線程模式;

點擊播放按鈕;

在Console窗口下觀察不同;

1. L_M_N模式下你應(yīng)該看到這樣的輸出:

2. LM_N和LMN模式下你應(yīng)該看到這樣的輸出:

然后,然后這個無聊的demo就完了。那這個無聊的demo到底做了啥?

這個無聊的demo通過兩個類的協(xié)同工作來累加一個值,一個是MNumAccSys,另一個是LNumAccSys,他們的前綴L或者M(jìn)代表了我們對它的抽象,L代表了邏輯線程,M代表了主線程。敏感的同學(xué)應(yīng)該可以意識到筆者這里想扯的是表現(xiàn)與邏輯分離,但我們這里還不想展開說。

回來觀察Log都打些什么:

· 可以看到在L_M_N模式下,MFrame(主線程幀號)第一幀的時候把數(shù)值從0加到了1,然后由LFrame(邏輯線程幀號)在146幀的時候把這個值從1加到了2。繼續(xù)看下去的話會發(fā)現(xiàn)這兩個幀號就如同你和你的前男/女友一樣-沒有半毛錢關(guān)系;

· 接著我們看LM_N和LMN模式,會發(fā)現(xiàn)這兩個幀號變得如膠似漆-你現(xiàn)男/女友的感覺;

接著你可以繼續(xù)跑下去或者編個手機(jī)包測試一段時間,觀察有沒有多線程崩潰或錯誤。如果沒有,那歡迎感興趣者繼續(xù)閱讀。

我們意識到這個demo有這樣一個特點:在不同線程模式中維持了相同的時序,所以無論哪個線程跑得快慢、多少,運行結(jié)果相同。這里大家敏感的話可以意識到筆者想扯幀同步,沒錯,但是我們這里也不想馬上展開說。

那我們這個累加邏輯是怎么實現(xiàn)的呢?

可見我們實際上是在利用消息機(jī)制,在多線程的時候是線程間異步通訊,在單線程的時候是線程內(nèi)異步通訊,所以我們的時序可以保證。

同時提一下,整個邏輯的起始,放在了EntranceForDemo1中:

恭喜你現(xiàn)在你做了個任意線程模式下都能跑的游戲

Demo2

如果我們改下代碼,讓計數(shù)只在L層的LNumAccSys計算,而在M層為一個UI.Text控件賦值呢(DisplayUIForDemo2)?那恭喜你,你已經(jīng)做到了任意線程模式下的邏輯和表現(xiàn)分離,懶得自己寫的同學(xué)請運行Demo2。如果出現(xiàn)Unity版本導(dǎo)致的UI不兼容,就請你自己怎么搞下,筆者就不管了。

Prefab長這樣:

入口在這:

實際邏輯在這:

Demo3

那如果我們再改下呢?我們加入一個NFakeServerMgr,用于提供每秒一次的邏輯幀驅(qū)動。那么一旦這個NFakeServerMgr變成真Server,頻率變成66毫秒一次,那我們就變成了一個任意線程模式、表現(xiàn)邏輯分離的幀同步游戲了。仍然懶得自己寫的同學(xué)就請運行Demo3。

模擬幀同步服務(wù)器:

示例幀同步客戶端:

Demo4

那如果我們再繼續(xù)猛烈的改一下呢?數(shù)據(jù)分離,加入實體,XXXSys…呢?恭喜你,你已經(jīng)有了一個任意線程模式、表現(xiàn)邏輯分離、ECS的幀同步游戲了…。懶得寫的同學(xué)也自己去寫,這么多代碼已經(jīng)超過了Demo的容量。

本文Demo中沒說的東西

· 你可能注意到了FakeObjPoolMgr是假的

這里只描述一下該寫什么東西:你需要有一個多線程自釋放對象池

· 其實LogUtil也值得你看下

· 其實筆者本身在這個GLogic上做的東西遠(yuǎn)不止文中所提及的內(nèi)容,大家請發(fā)揮想象力

你說了這么多,這GLogic到底是啥

限于篇幅我們這里簡單說說里面最基本的一些概念,其它更深層的用法請大家自己閱讀代碼吧,別擔(dān)心,里面有充足的注釋。

基本上GLogic作為一個邏輯框架,提供了兩個東西:

1. 時序控制

2. 消息機(jī)制

它通過實現(xiàn)一個叫做"邏輯樹"的概念來達(dá)成以上兩點。

1. 邏輯樹

a) 邏輯樹由邏輯節(jié)點互相掛接組成,邏輯節(jié)點是一個實現(xiàn)了IGLogicNode接口的類;邏輯樹的掛接形態(tài)是時序的基礎(chǔ);

b) IGEvent和IGEventListener分別作為消息和消息監(jiān)聽器的接口,提供了在邏輯樹中監(jiān)聽消息的能力;

c) 邏輯樹的根節(jié)點一般稱為LogicCore,本身仍然是一個邏輯節(jié)點,但額外擔(dān)負(fù)了循環(huán)入口的重?fù)?dān);

d) 邏輯樹之間的相互掛接實現(xiàn)了上面各Demo中的任意線程模式切換

2. 時序控制

樹狀結(jié)構(gòu),深度優(yōu)先遍歷

圖中弧線表示默認(rèn)執(zhí)行順序,

本執(zhí)行順序可通過"節(jié)點優(yōu)先級"進(jìn)行深度定制

3. 消息機(jī)制

a) 層級消息廣播

可見在不同層級上拋出的消息,它的輻射面是不同的

本順序可以通過"消息優(yōu)先級"進(jìn)行深度定制

b) 消息監(jiān)聽

根據(jù)我們的廣播原理,各Sys都將監(jiān)聽到Event1和Event2

但Event1的廣播量明顯有浪費

c) 同步及異步消息

各Sys會立即收到Event1,而Event2則會在下一幀收到

d) 線程安全

Bridge是一個線程安全節(jié)點,這樣另一個線程就能安全的在它上面拋出Event1

各Sys將在ThreadA的時序內(nèi)收到Event1,無需擔(dān)心線程安全問題

4. 其它:

a) 消息攔截,在HandleEvent中返回true來阻止消息繼續(xù)廣播。這個特性在異步Job分配、負(fù)載控制、loading攔截輸入等場景尤其便利。

b) 節(jié)點優(yōu)先級、消息監(jiān)聽優(yōu)先級,決定了節(jié)點的執(zhí)行順序及收到消息的順序,這個機(jī)制在動態(tài)啟動高優(yōu)先級邏輯、數(shù)據(jù)池優(yōu)先于所有邏輯感知數(shù)據(jù)變化等場景尤其便利。

c) C++版本?GLogic有適用于Unreal4的C++版本,邏輯思想類似,大家可以自行改造。

綜述

說這么多,筆者無非想表達(dá)一個意思:希望GLogic能幫助你在當(dāng)下多核設(shè)備環(huán)境中搭建高性能、高靈活度的游戲框架。

使用代碼的話請保留作者聲明。

總結(jié)

以上是生活随笔為你收集整理的scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。