幀同步游戲開發(fā)要點(diǎn)

結(jié)論


先說一下我們在研究和使用了幀同步之后从绘,得出的結(jié)論:

如果項(xiàng)目沒有錄像、觀戰(zhàn)功能扰肌,請先放棄使用幀同步的念頭键畴,嘗試使用狀態(tài)同步。因?yàn)樵O(shè)計(jì)得好的狀態(tài)同步,可以在很少流量基礎(chǔ)上,完成類幀同步的效果。除非在通信上沒有壓縮空間沃暗,再考慮幀同步。

如果項(xiàng)目需求有中途加入何恶,且不能容忍從頭Replay帶來的等待孽锥,游戲互動(dòng)玩法(游戲內(nèi)個(gè)體之間的相互作用)還非常復(fù)雜,則請慎重考慮是否使用幀同步细层。

要點(diǎn)


確定性運(yùn)算

  • 浮點(diǎn):目前除了主機(jī)平臺(tái)上由于其平臺(tái)的統(tǒng)一性使用的技術(shù)不同外惜辑,其他平臺(tái)基本上都是使用的定點(diǎn)數(shù)做的確定性運(yùn)算。這需要將所有涉及同步部分的邏輯運(yùn)算疫赎,都要使用定點(diǎn)運(yùn)算盛撑。這個(gè)工作,對于不同規(guī)模的項(xiàng)目而言捧搞,工作量可大可小抵卫。如果項(xiàng)目中引用了第三方庫到同步邏輯部分的話,那么這個(gè)第三方庫也要被定點(diǎn)數(shù)重寫胎撇。關(guān)于定點(diǎn)數(shù)介粘,如果沒有太多的精力自寫的話,可以嘗試在網(wǎng)上查找定點(diǎn)庫晚树,網(wǎng)上已經(jīng)有一些開源的定點(diǎn)庫姻采,可以拿來直接用,但注意在使用這些庫時(shí)的精度問題爵憎。因?yàn)檫@些定點(diǎn)數(shù)庫的設(shè)計(jì)慨亲,在使用時(shí),依然使用浮點(diǎn)數(shù)作為定點(diǎn)數(shù)的聲明和定義宝鼓,面對不同的編譯器和運(yùn)算器刑棵,浮點(diǎn)轉(zhuǎn)成定點(diǎn)數(shù)的精度處理上,可能是不一致的愚铡。所以铐望,在使用前,請驗(yàn)證精度有沒有問題≌埽或者采用其他的方式,比如不再使用浮點(diǎn)數(shù)進(jìn)行聲明和定義营曼。
  • 隨機(jī):如果游戲中同步部分的邏輯乒验,使用了隨機(jī),則需要自己實(shí)現(xiàn)一套跨平臺(tái)的隨機(jī)算法蒂阱,保證所有平臺(tái)隨機(jī)的一致锻全。當(dāng)然,隨機(jī)還會(huì)帶來另一個(gè)問題录煤,就是中途加入時(shí)隨機(jī)數(shù)的一致性問題鳄厌,要保證中途加入的客戶端,執(zhí)行與其他客戶端一致的隨機(jī)序列妈踊。這些可能需要我們在實(shí)現(xiàn)隨機(jī)算法時(shí)了嚎,兼顧到需要同步到另一端的需求。
  • 物理:基本上廊营,大部分的游戲都會(huì)用到物理歪泳,拋開物理,也會(huì)用到碰撞露筒。因?yàn)榇_定性運(yùn)算的問題呐伞,我們需要重寫一套確定性物理引擎。
  • 動(dòng)畫:如果游戲部分同步邏輯慎式,比如AnimationEvent伶氢,坐標(biāo)等是由動(dòng)畫驅(qū)動(dòng)的,那這部分也需要重新設(shè)計(jì)瘪吏,不能使用內(nèi)置的驅(qū)動(dòng)邏輯癣防。
  • 其他:這里就包括所有涉及浮點(diǎn)的非運(yùn)算邏輯了,比如invoke肪虎、yield等劣砍,這些接口要避免使用。

時(shí)序

  • 時(shí)序:要保證不同的客戶端扇救,數(shù)據(jù)的存儲(chǔ)刑枝、邏輯的執(zhí)行保持時(shí)序一致。所以迅腔,一些常用的數(shù)據(jù)結(jié)構(gòu)就不能勝任了装畅,比如常用的Dictionary、hashset等沧烈,需要我們使用其他的數(shù)據(jù)結(jié)構(gòu)掠兄,比如類SortedDictionary這個(gè)效率偏差,或者自寫一套保證時(shí)序的數(shù)據(jù)結(jié)構(gòu)和算法。

難點(diǎn)-中途加入


幀同步的難點(diǎn)在于中途加入蚂夕,當(dāng)然這里的中途加入迅诬,不討論從頭Replay一遍的方案,如果你的項(xiàng)目婿牍,能夠容忍從頭Replay侈贷,那就可以跳過了。這里討論的是等脂,將其他客戶端的現(xiàn)場正確地同步給中途加入的客戶端這種方案俏蛮。在最開始的結(jié)論部分已經(jīng)提過,如果游戲玩法比較簡單上遥,中途加入還是很好實(shí)現(xiàn)的搏屑。但如果包含復(fù)雜的互動(dòng)玩法,那對于游戲開發(fā)來說粉楚,將是類似兩萬五千里長征似的漫長負(fù)擔(dān)了辣恋。中途加入要處理的問題很多,一個(gè)很小的功能需求改動(dòng)解幼,就可能導(dǎo)致整個(gè)同步機(jī)制掛掉抑党。而且要注意,這個(gè)改動(dòng)帶來的同步不一致還不一定是必現(xiàn)的撵摆。這就對開發(fā)和測試人員提出了極高的要求底靠,必須一點(diǎn)問題都沒有,不能有一丁點(diǎn)的bug特铝,一旦出現(xiàn)bug暑中,就是致命的——不同步。不同步不像其他的bug鲫剿,可以忍受鳄逾,不同步一旦發(fā)生,玩家的所有付出就都白費(fèi)了灵莲,結(jié)果不能上傳雕凹,得不到服務(wù)器的認(rèn)可,還可能會(huì)被認(rèn)為作弊政冻。

剛開始接觸幀同步的開發(fā)人員枚抵,可能覺得,中途加入明场,就把所有對象的狀態(tài)(比如:位置)同步給另一端不就行了嗎汽摹?那這里舉幾個(gè)比較簡單的例子,說明一下中途加入的復(fù)雜:

  • 碰撞反彈:這就涉及到時(shí)序問題苦锨,先碰撞的就要先反彈逼泣。那么趴泌,某一時(shí)刻,3個(gè)物體碰撞在一起拉庶。此刻有玩家B中途加入戰(zhàn)局嗜憔,就需要將玩家A現(xiàn)場同步給玩家B,那如何同步才能保證砍的,在B端玩家下一刻執(zhí)行反彈邏輯順序與A一致呢痹筛?

  • 碰撞過程:在使用碰撞過程中,經(jīng)常會(huì)依賴某個(gè)指定的碰撞過程廓鞠,比如Enter、Stay谣旁、Exit等床佳。以Enter為例,某一時(shí)刻榄审,玩家A現(xiàn)場兩個(gè)物體碰撞觸發(fā)了Enter過程砌们,并且A端將Enter的回調(diào)邏輯處理完畢,則此時(shí)A現(xiàn)場的狀態(tài)就是處理完之后的狀態(tài)搁进。此時(shí)浪感,B加入戰(zhàn)局,需要將A現(xiàn)場同步給B饼问,那如果將A當(dāng)前狀態(tài)同步給B的話影兽,B端檢測到這兩個(gè)物體碰撞了,又會(huì)觸發(fā)一次Enter莱革,則再次調(diào)用Enter的回調(diào)邏輯峻堰,而A端不會(huì)再觸發(fā)回調(diào)。這就導(dǎo)致A與B端不一致盅视。

上面只是舉了幾個(gè)物理相關(guān)的例子而已捐名,還有很多其他的會(huì)導(dǎo)致不同步的問題,比如跟時(shí)間相關(guān)的狀態(tài)等等闹击,這里沒有列舉镶蹋。

總之,幀同步的終極問題是中途加入赏半。其他的問題都還好贺归,中途加入會(huì)導(dǎo)致后期的每一個(gè)功能改動(dòng),都可能會(huì)帶來整個(gè)版本的復(fù)查除破,其維護(hù)成本之高牧氮,可能會(huì)令很多團(tuán)隊(duì)承擔(dān)不起。因?yàn)槲覀儾荒茉试S中途加入出現(xiàn)bug瑰枫,一旦出現(xiàn)bug踱葛,就是致命的丹莲。所以,還是開篇的那句話:如果項(xiàng)目不需求中途加入尸诽,幀同步向你敞開大門甥材,如果需求中途加入,請仔細(xì)評(píng)估玩法和開發(fā)之間的矛盾性含,選擇一條更適合的道路洲赵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市商蕴,隨后出現(xiàn)的幾起案子叠萍,更是在濱河造成了極大的恐慌,老刑警劉巖绪商,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苛谷,死亡現(xiàn)場離奇詭異,居然都是意外死亡格郁,警方通過查閱死者的電腦和手機(jī)腹殿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來例书,“玉大人锣尉,你說我怎么就攤上這事【霾桑” “怎么了自沧?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長织狐。 經(jīng)常有香客問我暂幼,道長,這世上最難降的妖魔是什么移迫? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任旺嬉,我火速辦了婚禮,結(jié)果婚禮上厨埋,老公的妹妹穿的比我還像新娘邪媳。我一直安慰自己,他們只是感情好荡陷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布雨效。 她就那樣靜靜地躺著,像睡著了一般废赞。 火紅的嫁衣襯著肌膚如雪徽龟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天唉地,我揣著相機(jī)與錄音据悔,去河邊找鬼传透。 笑死,一個(gè)胖子當(dāng)著我的面吹牛极颓,可吹牛的內(nèi)容都是我干的朱盐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼菠隆,長吁一口氣:“原來是場噩夢啊……” “哼兵琳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骇径,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤躯肌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后破衔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體羡榴,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年运敢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忠售。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡传惠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稻扬,到底是詐尸還是另有隱情卦方,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布泰佳,位于F島的核電站盼砍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逝她。R本人自食惡果不足惜浇坐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望黔宛。 院中可真熱鬧近刘,春花似錦、人聲如沸臀晃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徽惋。三九已至案淋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間险绘,已是汗流浹背踢京。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工誉碴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漱挚。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓翔烁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旨涝。 傳聞我的和親對象是個(gè)殘疾皇子蹬屹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348