最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

游戲開發(fā):狀態(tài)同步核心原理剖析

2023-04-12 16:18 作者:unity小能手  | 我要投稿

狀態(tài)同步是做網(wǎng)絡(luò)游戲必然要掌握的一種服務(wù)端/客戶端同步技術(shù)。什么是狀態(tài)同步,具體到游戲中是如何實現(xiàn)的,帶著這些問題本文將會從以下3個方面給大家詳細的剖析狀態(tài)同步。

1: 什么樣的游戲可以用狀態(tài)同步來實現(xiàn);

2: 服務(wù)器上如何跑游戲邏輯?

3: 服務(wù)器與客戶端如何同步?

什么樣的游戲選擇用狀態(tài)同步

只要是網(wǎng)絡(luò)游戲,涉及到服務(wù)器與客戶端同步的游戲,都可以使用狀態(tài)同步,舉幾個狀態(tài)同步的例子,如《魔獸世界》,騰訊《吃雞》,《自走棋》等大部分的多人在線的網(wǎng)絡(luò)游戲都是用狀態(tài)同步來做的,換句話說網(wǎng)絡(luò)游戲中除了少數(shù)人對戰(zhàn)(5v5, 10v10)的Moba類,FPS類等會用幀同步以外,其它的都是狀態(tài)同步。像大型多人同時在線的游戲,只能用狀態(tài)同步來做。目前主流的網(wǎng)絡(luò)同步方式是狀態(tài)同步與幀同步,狀態(tài)同步可以做任意類型的游戲,幀同步只能做少數(shù)幾個人在一局同時對戰(zhàn)的短時間的網(wǎng)絡(luò)游戲。一個游戲是否考慮使用狀態(tài)同步的理由就在于你的游戲是否用打算用幀同步,如果不用或不滿足使用幀同步條件,就可以使用狀態(tài)同步。總結(jié)一下:能用幀同步的游戲是少數(shù)幾個人同時在一局游戲中,這局游戲的時間長度不會太長(20分鐘),這種網(wǎng)絡(luò)游戲可以考慮使用幀同步,比如《王者榮耀》《守望先鋒》。其它不滿足上述條件的網(wǎng)絡(luò)游戲都采用狀態(tài)同步。狀態(tài)同步也能做出很好的像《王者榮耀》與《守望先鋒》這種幀同步能做的游戲, 如騰訊《吃雞》。

幀同步與狀態(tài)同步相比,幀同步只同步用戶操作,由客戶端迭代計算所有的游戲邏輯,更像是做單機游戲,只是有些玩家的輸入是來自服務(wù)器而已。幀同步在操作手感,玩家的響應(yīng)時間上,會比狀態(tài)同步做的更出色。但是也有它的問題,比如防作弊,斷線重連需要從頭運算一幀幀快速迭代。這就限制了幀同步能做的游戲類型非常有限,不能做大量人同時在線或長時間在線的游戲。比如MMORPG,單服5000人同時在線,這種你做幀同步,客戶端要迭代5000個玩家物體的每幀的計算,同時長期在線,比如MMORPG游戲服務(wù)已經(jīng)跑了一個月了,新進來的用戶,如果用幀同步得要從1個月以前的所有玩家操作開始迭代,跳到最新得操作后才能繼續(xù)游戲。所以像這種用幀同步是無法實現(xiàn)的,只能用狀態(tài)同步?,F(xiàn)在狀態(tài)同步對于手感要求比較高的游戲,比如《吃雞》可以采用可靠的udp來做傳送,來優(yōu)化網(wǎng)絡(luò)響應(yīng),獲得更好的玩家體驗。

?

服務(wù)器上如何跑游戲邏輯

?

狀態(tài)同步的一個核心是把整個游戲的所有數(shù)據(jù)與邏輯都跑到服務(wù)器上。這種咋一聽感覺很難,其實也就是像寫客戶端一樣,跑一個update的幀頻率來進行迭代(一般1秒15~20次迭代,或者動態(tài)調(diào)整)。和客戶端一樣,每個游戲的玩家都有一個數(shù)據(jù)對象,唯一不同的是客戶端有渲染,服務(wù)器只有數(shù)據(jù)沒有渲染。一般我們會在邏輯服上創(chuàng)建一個類似的數(shù)據(jù)結(jié)構(gòu):

當(dāng)創(chuàng)建一個玩家登錄到邏輯服的時候,服務(wù)器中的3D世界就會創(chuàng)建一個這樣的數(shù)據(jù)對象。接下來就要嘗試讓這個對象在游戲世界中跑動交互起來,服務(wù)端的地圖如何做呢?其實地圖數(shù)據(jù)可以導(dǎo)出為地形高度圖(x, y, z)+道路連通數(shù)據(jù)(哪些是可以行走,哪些不可以行走)。這個對團隊的技術(shù)積累是有一點要求的。根據(jù)游戲不同的類型來做地圖編輯器,來采用最合適的技術(shù)。同時客戶端+服務(wù)端都要使用這套,客戶端有地圖編輯器工具編輯地圖的地形+烘焙地圖連通數(shù)據(jù),能將這些數(shù)據(jù)按照對應(yīng)的格式導(dǎo)出給服務(wù)端用,服務(wù)端使用這些數(shù)據(jù)利用上面的Update來進行迭代計算(和客戶端開發(fā)的Update迭代是一樣的)。

地圖技術(shù)+尋路導(dǎo)航解決以后,其它的推動游戲計算的也移植到到服務(wù)端,比如物理引擎,我們可以在服務(wù)器上部署一個物理引擎,然后從服務(wù)端的update來做物理引擎模擬迭代,再把物理剛體位置旋轉(zhuǎn)等同步給服務(wù)端上的玩家數(shù)據(jù)對象,這樣讓服務(wù)器上也可以跑物理引擎。具體可以參考我們的《內(nèi)置定點數(shù)物理引擎系列》的文章。

?

服務(wù)端與客戶端如何同步

?

服務(wù)器上架起了游戲地圖,在服務(wù)端Update的迭代之下,讓一個個的玩家數(shù)據(jù)+NPC數(shù)據(jù)等在服務(wù)端”跑起來”,接下來是如何與客戶端同步。狀態(tài)同步是不是服務(wù)器上位置變換了,客戶端的位置就要同步一次呢?其實不是或者說不全是,我們會把游戲中的重要變化,描述成”狀態(tài)變化”。狀態(tài)同步你記住很重要的一條:?服務(wù)端跑服務(wù)端的,客戶端跑客戶端的,每次狀態(tài)發(fā)生變化了,要處理之前先同步。

接下來我們通過具體的例子來解釋一下這句話。我們拿客戶端在地圖上點擊p點,然后尋路導(dǎo)航到p點。這個過程來講解狀態(tài)同步。

Step1:當(dāng)客戶端玩家A用鼠標(biāo)或者觸摸在地圖上點了一下以后,就把目的的地圖坐標(biāo),和操作事件(類型標(biāo)識)發(fā)送給服務(wù)端。

Step2: 服務(wù)端接收到這個事件,做合法性檢查(比如操作的合法性檢查, 目的地坐標(biāo)范圍合法性, 玩家在A點,導(dǎo)航去到千里之外的B點,距離太遠,可能有外掛的嫌疑),檢查通過后再處理。

Step3: 合法性檢查通過后,把事件廣播給能看到A包括A在內(nèi)的所有玩家(AOI技術(shù)),告訴大家,A發(fā)起操作,要行走到目的地p點。這里服務(wù)端發(fā)送的數(shù)據(jù)包內(nèi)要帶上服務(wù)器上玩家A的最新狀態(tài)信息(A行為狀態(tài)改變了,帶最新的位置信息,操作之前先同步位置等最最新狀態(tài)信息)。

Step4: 服務(wù)端走服務(wù)端的,迭代玩家A的數(shù)據(jù)對象在尋路+導(dǎo)航的作用下每次Update更新A的位置。注意,服務(wù)端走服務(wù)端的,這個過程不會同步給客戶端了

Step5: 客戶端收到玩家A要行走到P點的事件,對于A來說狀態(tài)改變了,先同步,同步數(shù)據(jù)包中服務(wù)器上玩家A的最新狀態(tài)信息,同步后再做本地尋路導(dǎo)航行走到p點,?客戶端跑客戶端的。

Step6: 服務(wù)端上玩家A走到了目的地,這個時候玩家A的狀態(tài)變化了,服務(wù)端把這個狀態(tài)事件,發(fā)送給對玩家A感興趣的所有玩家包括A自己。

Step7: 客戶端收到玩家A到達目的地的狀態(tài)事件后,就同步一下數(shù)據(jù)包中服務(wù)端上玩家A的狀態(tài)信息。

?

由上面得到的結(jié)論就是,行走過程中位置的變化,沒有必要同步到客戶端,服務(wù)端跑服務(wù)端的,客戶端跑客戶端的,只是重要狀態(tài)變化后,服務(wù)端把最新的信息發(fā)送給客戶端,客戶端同步。在上面的例子中,玩家在行走中,玩家又有其它的攻擊操作了,那么又是狀態(tài)變化了,服務(wù)端又會在處理這個攻擊事件的時候帶上最新狀態(tài)信息,客戶端同步狀態(tài)信息,然后再進行攻擊(播放攻擊動畫,怪物掉血動畫),服務(wù)器上也在做攻擊,攻擊完成后同步最新的狀態(tài)與血量即可。狀態(tài)同步的核心就是:處理每種狀態(tài)和事件之前,先同步,然后再服務(wù)端計算服務(wù)端的,客戶端做客戶端的。直到有新的狀態(tài)出來,先同步,再處理。

?

好今天的狀態(tài)同步就分享到這里,關(guān)注我們學(xué)習(xí)更多的網(wǎng)絡(luò)游戲?qū)崙?zhàn)系列教程。


游戲開發(fā):狀態(tài)同步核心原理剖析的評論 (共 條)

分享到微博請遵守國家法律
永和县| 尤溪县| 来宾市| 黎平县| 安远县| 泽库县| 浙江省| 前郭尔| 东乌| 海城市| 同心县| 栾城县| 奈曼旗| 西青区| 汉源县| 姜堰市| 广丰县| 抚宁县| 舞钢市| 东台市| 庆阳市| 马关县| 广饶县| 南漳县| 若羌县| 朝阳县| 炎陵县| 缙云县| 德保县| 陆丰市| 姚安县| 嘉鱼县| 云霄县| 富源县| 泰和县| 鄄城县| 桐柏县| 宜城市| 丁青县| 白山市| 鞍山市|