【网络游戏同步技术】帧同步的一致性
【參考博文】GAD-網(wǎng)絡(luò)游戲同步技術(shù)
引言
幀同步的形式很泛,根據(jù)不同游戲,使用的技術(shù)范圍又不一樣,所以大家都在講方法論,要全面覆蓋可能需要較大的篇幅,所以,我簡單描述下。
假定大家對幀同步和狀態(tài)同步有一定的認識,理論上的問題,我就不作過多解釋了。
大家都知道,幀同步的核心是一致性,通過一致性的算法,使得各端輸入一致的情形下,輸出也是一致的,以此,可以解決同步的根本問題——仲裁的結(jié)果是一致的。
嚴格的幀同步,實現(xiàn)起來,解決算法一致性、輸入一致性的問題基本就能實現(xiàn)了,然而實踐過程中,由于網(wǎng)絡(luò)延時、抖動、用戶實時體驗帶來了一些其他的問題,使得問題解決起來變得更復(fù)雜,為了把問題聚焦,這部分內(nèi)容我們就不重點討論,后面的篇幅,主要聚焦在如何保證算法一致性和輸入一致性。
1.算法一致性(或者確定性)
算法不一致的主要原因是數(shù)值計算不一致和算法流程不一致。
數(shù)值計算。?
浮點數(shù)的運算精度,在不同機器上有不同的表現(xiàn),由此,導(dǎo)致了浮點數(shù)的精度可能導(dǎo)致計算結(jié)果不一致。?
所以,首要問題是把游戲邏輯部分(后續(xù)會有關(guān)于邏輯和表現(xiàn)分離的說明)所使用的浮點數(shù)運算全部改成具有一致性的數(shù)值運算。
那么,怎么實現(xiàn)一種數(shù)值運算,既具有小數(shù)的表達能力,又有一致性的運算結(jié)果呢??
常規(guī)方法中,盡管形態(tài)多樣,但理論來講,基本都是定點數(shù)(關(guān)于定點數(shù)的實現(xiàn),可以翻看其他資料)。
工程上,還要考慮定點數(shù)的精度,不同的精度,性能可能不一樣,如何在精度和性能之間做平衡,需要結(jié)合自己的數(shù)值范圍來確定。
綜上所述,我們導(dǎo)出需要實現(xiàn)的代碼。?
實現(xiàn)1:定點數(shù)?
包含浮點數(shù)計算的常規(guī)算法,包含加、減、乘、除、絕對值、負運算等基本運算,另外,還要根據(jù)自己的使用實現(xiàn)開平方、指數(shù)函數(shù)、對數(shù)函數(shù),三角函數(shù)等。?
其中定義域較大的函數(shù),一般使用解方程的方法,比如牛頓法,定義域較小或者可以限制到一個周期以內(nèi)的函數(shù),比如三角函數(shù),定義域在0-2pi,可以使用泰勒級數(shù),具體用幾階,要根據(jù)自身對精度的要求,同時,由于有限項的泰勒級數(shù)只在某些定義域區(qū)間較好的擬合度,所以需要在通過數(shù)值分析來論證精度。最后,其實三角函數(shù)可以通過查表法來實現(xiàn),性能快,精度與所需要存儲的表格大小有關(guān)系。
至此,我們擁有了一致性的定點數(shù),我們用它來替換浮點數(shù),然后在有些應(yīng)用場景,邏輯層也會使用到更多的數(shù)學工具,比如向量、矩陣、歐拉角、四元數(shù)等,所以我們得實現(xiàn)這部分數(shù)學工具。
實現(xiàn)2:一致性數(shù)學工具?
1. 向量、矩陣、歐拉角、四元數(shù)?
2.幾何工具:點、線、面、體,各種幾何元素的關(guān)系,相交性檢測(做一個射擊游戲,需要射線檢測來判定是否命中),不是所有的都要寫,用多少實現(xiàn)多少。
除了上述的內(nèi)容,還有邏輯層可能用了物理,物理部分主要包含碰撞檢測和動力學?
比如拋出一個籃球,帶拋物線的,需要一致性的物理運算,籃球碰到框則需要一致性的碰撞檢測,碰到框之后的反饋也可能需要動力學表現(xiàn)(這部分可以是表現(xiàn)層)。
實現(xiàn)3:一致性物理系統(tǒng)?
包含邏輯層需要使用的動力學和碰撞檢測
有些游戲邏輯需要動畫系統(tǒng)支持,比如動作游戲,一個技能觸發(fā)一個動作,動作除了表現(xiàn)層的動畫(比如2D游戲的圖片序列),還有一些影響邏輯的部分,比如動畫控制了攻擊判定框在時間軸的變化,這個時候需要實現(xiàn)邏輯層上的動畫,主要需要解決的問題是,時間要改成整數(shù)或者定點數(shù),另外,插值數(shù)據(jù)的類型也得使用一致性得數(shù)據(jù)類型,比如位置向量等。
實現(xiàn)4:一致性動畫系統(tǒng)?
與常規(guī)得表現(xiàn)層動畫類似,可以根據(jù)需要簡化。(比如不需要骨骼或者不需要融合)
數(shù)值一致性的常規(guī)問題大致說這么多,還有些其他的內(nèi)容,比如尋路,AI判定等凡是有浮點數(shù)的地方,全部換成定點數(shù),最終還是需要根據(jù)項目需求,選擇需要實現(xiàn)的內(nèi)容。
注意:定點數(shù)的運算性能比浮點數(shù)差很遠,數(shù)量級在10-100以上,需要評估性能,好規(guī)劃策劃設(shè)定的問題規(guī)模。
前面講到,算法不一致的另外一個原因是:流程不一致。?
流程不一致的主要原因,可能是輸入導(dǎo)致的,也可能是架構(gòu)導(dǎo)致的。
輸入導(dǎo)致的算法流程不一致,這個問題,我們把它歸到輸入一致性,后面討論。?
主要討論架構(gòu)導(dǎo)致的流程不一致。
首先,幀同步需要在架構(gòu)上做邏輯和表現(xiàn)分離,那么,什么是邏輯,什么是表現(xiàn),其實沒有絕對的定論,一般來說,對游戲結(jié)果有影響的部分為邏輯,對游戲結(jié)果沒影響,只影響視覺、聽覺、和其他與游戲結(jié)果無關(guān)的用戶交互的部分為表現(xiàn)。
整個幀同步的運行體系,簡單的模型歷程流程大致為:?
游戲框架跟從網(wǎng)絡(luò)收取同步包->上傳用戶輸入->分發(fā)同步包給邏輯內(nèi)核(用戶輸入)->邏輯內(nèi)核更新->邏輯內(nèi)核發(fā)送消息給表現(xiàn)層->表現(xiàn)層更新
需要注意的幾點:?
1.邏輯更新頻度和表現(xiàn)更新頻度不一致?
2.邏輯內(nèi)核更新的時間片是等間隔的,表現(xiàn)不一定?
3.同步包的內(nèi)容是所有用戶在某個時間片以內(nèi)的輸入
容易出錯的地方是,邏輯層和表現(xiàn)層交織在一起,表現(xiàn)層影響邏輯層,導(dǎo)致算法流程不一致。
所以,幀同步實施的第一要務(wù)是明確分離邏輯層和表現(xiàn)層。
輸入一致性
完了算法計算一致性,接下來,我們要討論,輸入一致性的問題。?
這里所說的輸入比較籠統(tǒng),整理講的是邏輯層的輸入,包含一些全局變量、隨機數(shù)的種子等等,最重要的一個問題是,邏輯層每幀的時間間隔是固定的,沒有特殊需求的話,建議用整數(shù)表示,精確為毫秒。
一致性的細節(jié)問題還有很多,先大概講這么多吧。
解決了一致性問題,一個嚴格的幀同步模型,后續(xù)實施就相對輕松了。
強調(diào)下,為什么反復(fù)提“嚴格”的幀同步模型,因為實際運行過程中,很可能出現(xiàn)不嚴格的模型,當網(wǎng)絡(luò)延時較大、抖動、以及游戲?qū)斎腠憫?yīng)有更高要求的時候,需要做一些預(yù)先的表現(xiàn)(表現(xiàn)層的預(yù)測),當結(jié)果預(yù)測不一致的時候,需要回滾,這個跟狀態(tài)同步差不多,當然也有邏輯層的預(yù)測,算幀同步的高級應(yīng)用,目前少有游戲使用。
最后,說下回放、斷線、反外掛、注意事項
幀同步實現(xiàn)回放有天生的技術(shù)優(yōu)勢,因為有了一致性的保證,存儲初始數(shù)據(jù)和用戶輸入,邏輯內(nèi)核啟動播放模式,將時間軸的用戶輸入,按照時間軸消耗即可。
斷線其實是回放的變種,應(yīng)用形態(tài)不一樣,技術(shù)差不多,可以不驅(qū)動表現(xiàn)。
反外掛,幀同步的游戲結(jié)果是所有客戶端一起說了算,算法一致性保證了大家的結(jié)果是一致的,可以簡單使用少數(shù)服從多數(shù)的方式來判定誰用外掛,兩方數(shù)量一致(或者差不多)的情形,可以使用部署在仲裁服務(wù)器上的邏輯內(nèi)核來計算結(jié)果,以服務(wù)器為準。
注意事項?
幀同步適用的情形:參與玩家數(shù)量不多(人數(shù)影響單個同步包的大小)?
有利情形:各端需要同步的NPC數(shù)量眾多、游戲邏輯運算量很大
大概就這么多,表達能力有限,感覺也沒講清楚,只是希望對你有所幫助。
總結(jié)
以上是生活随笔為你收集整理的【网络游戏同步技术】帧同步的一致性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java-php-python-ssm在
- 下一篇: 三相全控tc787触发电路_三相桥式全控