游戲幀同步的流程與實(shí)現(xiàn)

大綱

  • 幀同步的基本原理
  • 幀事件數(shù)據(jù)采集
  • 幀同步的事件處理與動畫
  • 幀同步的邏輯數(shù)據(jù)同步
  • 幀同步之跳幀處理

現(xiàn)代多人游戲中,多個客戶端之間的通訊大多以同步多方狀態(tài)為主要目標(biāo)佛吓,為了實(shí)現(xiàn)這一目標(biāo)宵晚,主要有兩個技術(shù)方向:

  • 狀態(tài)同步
  • 幀同步

狀態(tài)同步

狀態(tài)同步簡單來說就是同步游戲中的各種狀態(tài),當(dāng)客戶端發(fā)送游戲動作到服務(wù)器维雇,服務(wù)器接收到之后淤刃,通過計(jì)算游戲行為的結(jié)果,然后廣播下發(fā)給客戶端游戲中的各種狀態(tài)數(shù)據(jù)吱型∫菁郑客戶端接收到狀態(tài)數(shù)據(jù)后顯示內(nèi)容。這種做法類似于各個客戶端都在遠(yuǎn)程操作服務(wù)器上的軟件津滞。例如最高的mud铝侵,以及日后大量的國產(chǎn)網(wǎng)游,特別是回合制游戲触徐,大多采用這種方式咪鲜。

狀態(tài)同步的流程:

  1. 客戶端上傳操作到服務(wù)器
  2. 服務(wù)器收到后計(jì)算游戲行為的結(jié)果(如技能邏輯、戰(zhàn)斗計(jì)算等)
  3. 服務(wù)器以廣播的方式下發(fā)游戲中各種狀態(tài)
  4. 客戶端收到狀態(tài)后更新本地狀態(tài)(如動作狀態(tài)撞鹉、Buff狀態(tài)疟丙、位置等)

為了給游戲玩家更好的體驗(yàn)颖侄,減少同步的數(shù)據(jù)量,客戶端也會做很多的本地運(yùn)算享郊,減少服務(wù)器同步的頻率以及數(shù)據(jù)量览祖。

狀態(tài)同步其實(shí)是一種不嚴(yán)謹(jǐn)?shù)耐剑乃枷胫胁煌婕移聊簧系囊恢滦缘谋憩F(xiàn)并不是重要指標(biāo)炊琉,只要每次操作的結(jié)果相同即可展蒂。所以狀態(tài)同步對網(wǎng)絡(luò)延遲的要求并不高。例如:RPG游戲中200~300ms的延遲對用戶來說是可以接受的温自,但在RTS(即時戰(zhàn)略)游戲中50ms的延遲卻會很受傷玄货。

幀同步

幀同步是RTS游戲經(jīng)常采用的一種同步技術(shù)皇钞,狀態(tài)同步中數(shù)據(jù)量會隨著需要同步的單位數(shù)量增長悼泌,而對于RTS來講動不動就是幾百個單位可以被操作,如果這些都需要同步的話夹界,數(shù)據(jù)量是不能被接受的馆里,所以幀同步不同步狀態(tài),之同步操作可柿。例如游戲中同步玩家的操作指令鸠踪,操作指令包含當(dāng)前的幀索引。

簡單來說复斥,客戶端發(fā)送游戲動作到服務(wù)器营密,服務(wù)器接收并匯總,然后直接轉(zhuǎn)發(fā)給所有客戶端目锭,或者客戶端直接通過P2P技術(shù)發(fā)送评汰。客戶端根據(jù)收到的游戲動作來做運(yùn)算和顯示痢虹。這種做法等于客戶端之間相互遠(yuǎn)程控制其他客戶端上的游戲軟件被去。早期的ipx網(wǎng)絡(luò)游戲,例如紅色警戒奖唯、帝國時代惨缆、星際爭霸,以及大量支持網(wǎng)絡(luò)連線雙打游戲機(jī)模擬機(jī)丰捷,都是采用這種方式坯墨。

那些游戲需要使用幀同步呢?

  • 多人實(shí)時對戰(zhàn)游戲
  • 游戲中需要戰(zhàn)斗回放功能
  • 游戲中需要加速功能
  • 需要服務(wù)器同步邏輯校驗(yàn)防止作弊

幀同步的流程

  1. 同步隨機(jī)種子:游戲中設(shè)計(jì)隨機(jī)數(shù)的使用病往,通過同步隨機(jī)數(shù)種子可以保持隨機(jī)數(shù)的一致性畅蹂。
  2. 客戶端上傳操作指令給服務(wù)器,操作指令包含游戲操作和當(dāng)前幀索引荣恐。
  3. 游戲廣播所有客戶端的操作液斜,如果沒有操作也要廣播空指令來驅(qū)動游戲幀前進(jìn)累贤。
幀同步

幀同步主要依賴客戶端的能力,服務(wù)器僅僅是做一個轉(zhuǎn)發(fā)少漆,甚至客戶端可以無需服務(wù)器臼膏,通過P2P方式來轉(zhuǎn)發(fā)數(shù)據(jù)。由于只是轉(zhuǎn)發(fā)游戲的行為示损,所以廣播的數(shù)據(jù)量比狀態(tài)同步要小很多渗磅。非常適合游戲行為非常頻繁的動作游戲,諸如飛行射擊检访、FPS始鱼、RTS(即時戰(zhàn)略)。

狀態(tài)同步由于要把整個游戲的狀態(tài)都廣播下去脆贵,如果游戲中的對象特別多医清,比如滿屏的子彈、怪物卖氨,那么要廣播的數(shù)據(jù)量就會很大会烙,這個時候幀同步的優(yōu)勢就比較明顯,因?yàn)椴还苡卸嗌佟睓C(jī)器控制的角色“筒捺,僅僅需要廣播玩家角色有關(guān)的操作即可柏腻。反過來,如果游戲中有大量玩家同時聚集系吭,那么幀同步和狀態(tài)同步的差異就不太明顯五嫂。反而狀態(tài)同步能得到更多安全性,因?yàn)橛螒蜻\(yùn)算在服務(wù)器上肯尺,比較容易防止外掛沃缘。

簡單來說,幀同步技術(shù)最要的概念是”相同的輸入 + 相同的時機(jī) = 相同的顯示“蟆盹。也就是說孩灯,游戲接收來自網(wǎng)絡(luò)的多個客戶端的操作,如果這些操作在各個客戶端上都是一樣的逾滥,那么多個客戶端的顯示也就是一樣的峰档,進(jìn)而帶來了”同步“的效果。在這種情況下寨昙,各個客戶端的運(yùn)算要絕對一致讥巡,不能依賴諸如本地時間、本地隨機(jī)等”輸入“舔哪,而要一切以網(wǎng)絡(luò)來的數(shù)據(jù)為主欢顷。

幀同步

因?yàn)閹降奶匦裕虼撕苋菀鬃龀鰬?zhàn)斗回放捉蚤,即服務(wù)器記錄所有操作抬驴,客戶端請求到操作文件再執(zhí)行一次炼七。幀同步的特性導(dǎo)致客戶端的邏輯實(shí)現(xiàn)和表現(xiàn)實(shí)現(xiàn)必須完全分離。

幀同步的目的在于消除網(wǎng)絡(luò)波動性帶給玩家的卡頓以及忽快忽慢的不良體驗(yàn)布持。

網(wǎng)絡(luò)波動的平滑處理

狀態(tài)同步和幀同步的比較和選擇

對于單位比較多的即時策略游戲豌拙,幀同步是很好的選擇。相反的题暖,如果玩家比較多按傅,狀態(tài)同步則更加合適,因?yàn)榘踩愿唠事薄R话愦笮蚆MOARPG都采用狀態(tài)同步唯绍,由于狀態(tài)同步采用C/S架構(gòu),所有狀態(tài)由服務(wù)器來控制枝誊,安全性比較高况芒,但流量比較大。幀同步采用的是囚徒模式侧啼,所有C端強(qiáng)制采用一個邏輯幀率牛柒,從而保證輸出一致堪簿,其特點(diǎn)是流量小痊乾,安全性較差。

囚徒模式又叫鎖步模式椭更,就是把所有參與對戰(zhàn)的客戶端看成排成一列的囚犯哪审,這些囚犯們的左腳都被鎖鏈給連起來,如果要往前走虑瀑,就只能同時邁步湿滓,如果其中某個人走快了或走慢了,都回讓整隊(duì)人停下來舌狗。

狀態(tài)同步和幀同步的比較

幀同步的基本原理

幀同步是一種對同步源進(jìn)行像素級同步顯示的處理技術(shù)叽奥,對于網(wǎng)絡(luò)上的多個接入者,一個信號將會通過主機(jī)同步發(fā)送給其他人痛侍,并同步顯示在各個終端上朝氓。同步信號可以是每幀的像素?cái)?shù)據(jù),也可以是影響數(shù)據(jù)變化的關(guān)鍵事件信息主届。

幀同步在網(wǎng)絡(luò)游戲應(yīng)用中的設(shè)計(jì)有別于傳統(tǒng)的MMORPG游戲赵哲,因?yàn)榭梢猿休d大量的后臺計(jì)算,實(shí)現(xiàn)類單機(jī)的效果君丁,所以可以在射擊類枫夺、飛行類游戲中實(shí)現(xiàn)彈幕計(jì)算或格斗類的高精度打擊效果。

什么叫做幀同步呢绘闷?服務(wù)器收集客戶端手機(jī)發(fā)送過來的操作橡庞,然后在特定的時間(收集完成之后)较坛,再廣播發(fā)送給每個客戶端“亲睿客戶端根據(jù)接收到的輸入燎潮,進(jìn)行同樣的邏輯處理,最終得到同樣的結(jié)果的過程扼倘。在實(shí)現(xiàn)上确封,一般都是以服務(wù)器按固定的幀率,來搜集每個客戶端的輸入再菊,然后把這些輸入廣播給所有客戶端爪喘。由于每個操作指令到達(dá)所有客戶端的時間(幀)都是一樣的,所以每個客戶端運(yùn)算的結(jié)果也是一樣的纠拔,也就是同樣的輸入就會得到同樣的結(jié)果秉剑。

這就好像是玩家通過網(wǎng)絡(luò)將操作手柄連接到你的手機(jī),這種同步方案是傳統(tǒng)單機(jī)局域網(wǎng)游戲中最常見的稠诲。

幀同步

幀同步模型最大的優(yōu)點(diǎn)在于強(qiáng)一致性侦鹏,每個客戶端的表現(xiàn)是完全一樣的,非常適合高度要求操作技巧的游戲臀叙。由于廣播的僅僅是玩家的操作略水,所以數(shù)據(jù)量很少。不管游戲中的角色數(shù)量劝萤、狀態(tài)數(shù)量有多大多復(fù)雜渊涝,都不會影響廣播的數(shù)據(jù)量。

幀同步模型最大的缺點(diǎn)是對所有玩家的延遲都有要求床嫌,一般來說要求在50毫秒以內(nèi)跨释,如果有一個客戶端網(wǎng)絡(luò)卡住了,所有客戶端都要停下來等待厌处。

另外在幀同步模式中鳖谈,數(shù)據(jù)同步的頻率較高,網(wǎng)絡(luò)延遲越小越好阔涉。由于TCP的滑動窗口機(jī)制和重傳機(jī)制缆娃,導(dǎo)致延時機(jī)制,導(dǎo)致延時無法控制洒敏。因此幀同步一般采用UDP進(jìn)行網(wǎng)絡(luò)傳輸龄恋,但UDP又會衍生出可靠性問題,對于客戶端凶伙,如果某些UDP包沒有收到郭毕,就會出現(xiàn)丟幀的情況。

幀同步技術(shù)原理

客戶端A的操作A1與客戶端B的操作B1函荣,共同封裝成OperateCmd數(shù)據(jù)發(fā)送給PVP服務(wù)器显押,PVP服務(wù)器每66毫秒產(chǎn)生一個邏輯禎扳肛,在該楨所在時間段內(nèi),收到A1和B1后乘碑,生成一個Frame數(shù)據(jù)塊挖息,在該幀時間結(jié)束時,將Frame發(fā)送給客戶端A和B兽肤。Frame數(shù)據(jù)塊內(nèi)有該幀的幀號套腹,客戶端A和B接收到Frame數(shù)據(jù)后,便知道該幀內(nèi)资铡,客戶端A和客戶端B都做了什么操作电禀。然后根據(jù)接收到的消息A1和B1進(jìn)行游戲表現(xiàn),最終呈現(xiàn)給玩家A和B的結(jié)果是一致性的笤休,從而實(shí)現(xiàn)客戶端A和B的數(shù)據(jù)同步尖飞。

幀同步

幀同步既然是在特定時間發(fā)送,也就是說每隔一段時間收集用戶操作指令店雅,那么要間隔多久內(nèi)政基。例如每隔一段時間搜索用戶的操作。此時闹啦,如果時間太快則網(wǎng)絡(luò)速率達(dá)不到要求沮明,如果時間太長則用戶操作不流程。哪里多少才比較合適呢亥揖?根據(jù)統(tǒng)計(jì)玩家至少要在50ms100ms可以完成一次珊擂,一般維持到1520次左右會比較安全圣勒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末费变,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子圣贸,更是在濱河造成了極大的恐慌挚歧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吁峻,死亡現(xiàn)場離奇詭異滑负,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)用含,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門矮慕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啄骇,你說我怎么就攤上這事痴鳄。” “怎么了缸夹?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵痪寻,是天一觀的道長螺句。 經(jīng)常有香客問我,道長橡类,這世上最難降的妖魔是什么蛇尚? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮顾画,結(jié)果婚禮上取劫,老公的妹妹穿的比我還像新娘。我一直安慰自己研侣,他們只是感情好勇凭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著义辕,像睡著了一般虾标。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灌砖,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天璧函,我揣著相機(jī)與錄音,去河邊找鬼基显。 笑死蘸吓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撩幽。 我是一名探鬼主播库继,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窜醉!你這毒婦竟也來了宪萄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤榨惰,失蹤者是張志新(化名)和其女友劉穎拜英,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琅催,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡居凶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了藤抡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侠碧。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缠黍,靈堂內(nèi)的尸體忽然破棺而出弄兜,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布挨队,位于F島的核電站谷暮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盛垦。R本人自食惡果不足惜湿弦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腾夯。 院中可真熱鬧颊埃,春花似錦、人聲如沸蝶俱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榨呆。三九已至罗标,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間积蜻,已是汗流浹背闯割。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竿拆,地道東北人宙拉。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像丙笋,于是被迫代替她去往敵國和親谢澈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容