遊戲網路同步 MMO位置同步

2021-06-23 08:31:54 字數 1249 閱讀 9134

前提

1.client和server之間或多或少存在網路延遲,需要提前做好對時,並在網路環境發生變化時校正時差。國內的公網通訊,非跨網的情況下,一般在120ms左右。本地的網路會好一些。

2. 要努力防止外掛程式,如果是以client的通知為主,也要做抽查,或者全部都校驗。

3. 應用dr技術,在沒有收到位置更新包的同時,client視野中的其他client按照遊戲規則運動。

4. 控制位置同步的頻率,減少網路流量。

以client為主的處理流程:

server只做簡單校驗,不做邏輯運算,優點是比較平滑,但是儘管有校驗,還是不可避免會有安全性的問題:

1. client登入之後,與server做對時計算時差。

2. 位置資料報內容有:當前位置、速度、方向、時間戳。

3.client傳送位置資料報給server。發包的觸發條件有兩個:超過了dr的閾值和定時tick觸發,如果沒有到定時時間但是超過了閾值,也應該傳送。

4.server收到位置資料後,首先根據遊戲規則校驗是否合法,不合法則拉回合法的位置。然後根據時差,**client當前的狀態,並把這個計算得到位置資料廣播給相關的client(包括client自己)。

5. client收到位置資料報後,根據時差,計算得到經過了延遲,現在實際的位置資訊。

6.client收到的位置資料是屬於其它玩家的:需要將當前模擬的玩家的位置修正到最新的位置,為了避免瞬移現象,乙個簡單的方法是**一段時間之後(比如一秒後)的狀態,用一條直線運動去修正。即,設想一秒後這個玩家在**,然後反推回現在應該用什麼速度運動可以在一秒後到達那個地方。在對方玩家網路環境不好的情況下,採用這種演算法會使得這個玩家在遊戲畫面上的速度突然加快一下,不過比瞬移會好很多。

7.client收到的資訊是屬於自己的,即server認可的自己的狀態(並廣播給別人了)。如果有誤差,則是由於server的**補償和網路延遲的誤差造成的。如果誤差超過了設定的閾值,就直接跳轉過去,否則不處理。

以server為準的處理流程:

以server的計算和模擬為主,client只在變化速度或者方向的時候,通知server,特點是安全性高,邏輯簡單,但是server的cpu消耗大:

與以client為主的處理流程不一樣的是第3步:server的計算也由兩個觸發條件,一是server定時做的server_move這種操作,來模擬計算並更新所有client的位置資訊;二是收到client的速度或者方向改變的通知包。在滿足這兩個條件之一的情況下,server就應該計算得到client當前的位置資訊,並廣播通知到相關的玩家。

寫在後面:

遊戲網路同步 dead reckoning

網遊中,玩家的位置同步經常會用到deadreckoning演算法,中文翻譯叫導航推測,下文簡稱dr。dr提供了隱藏延時和減少頻寬的方法。dr在本地模擬其他聯網玩家狀態 主要是位置資訊 減少網路頻寬消耗的同時盡可能的還原實際情況。在飛機遊戲中dr的乙個例子 1.飛機的運動速度都是固定的,兩台遊戲機聯機...

再談網路遊戲同步

呵呵,一年前的這個時候發過一系列討論網路遊戲同步的帖子。一年後的今天,再重新討論討論這個問題。不知道大家是否碰到過這種情況,當某個玩家發出乙個火球,這個火球有自己的運動 軌跡,那麼如何來判斷火球是否打中了人呢?大部分情況,當策劃提出這個要求的時 候,一般會被程式否認,原因是 太麻煩了,呵呵。複雜點的...

網路遊戲同步問題

介紹 作為乙個程式,你想過網路多人對戰遊戲是怎麼做出來的嗎?從外行的角度來看多人對戰遊戲是很神奇的 2個或者更多的玩家在同乙個時間經歷了相似的遊戲經歷,感覺他們就像在同乙個虛擬世界中遊戲一樣。但是作為程式設計師我們卻知道事實並不是他們想象的那樣的,他們看到的絕大多數其實都是假象。他們所認為玩家間同時...