CS模式網路遊戲的運動同步總結

2021-10-20 05:55:36 字數 1651 閱讀 4148

概述

目前有2種網路遊戲拓撲結構:peer to peer和client/server模式。在rts型別的遊戲中大都使用peer to peer的幀鎖定同步演算法(如紅警、帝國時代、war3等)。目前主流引擎都自帶的是client/server模式的伺服器(如unity3d, ue4等)。在此推薦《multiplayer game programming》,該書對幀同步演算法和cs模式的同步都有詳細的闡述;並且該書介紹的物件同步思路與ue4的思路類似。

本文只對cs模式下的運動同步進行總結,cs模式下,server是絕對的權威,一切以server為準。

記住:延遲是無法消除的,要盡可能地隱藏延遲,讓玩家具有良好的體驗。

先定義乙個符號:

運動狀態 s:   s表示某個運動狀態(如位置、速度、轉速等)

操作事件  i:   i表示運動輸入命令事件(如 加速度、立即停止、力等)

突發事件 e:  如受到阻擋、炮彈衝擊等非人為直接輸入。 

1. 啞終端方式(dump terminal)

類似早期的終端,只傳送鍵盤和滑鼠輸入給伺服器,客戶端不具有邏輯計算功能。

時序圖如下:

如上圖所示,客戶端狀態需要伺服器同步過來,自己沒有主動性,表現出一卡一卡的體驗。

使用者的輸入需要過rtt後才能得到反饋,客戶端的狀態比伺服器滯後rtt/2時長。

2. client interpolation

還是使用的啞終端方式,伺服器給出狀態a,b;然後客戶端使用ab的插值進行平滑過渡。

時序圖如下:

客戶端比伺服器滯後rtt/2 + 包同步間隔,客戶端邏輯帶有內插值功能。

3. client prediction & server correction

客戶端具有**功能(和伺服器具有同樣的**邏輯),伺服器會將狀態同步到客戶端,然後客戶端進行較正。這個裡面細節較多,主要分2個方面

進行考慮:

a.  非本地玩家(機械人、其它遠端玩家)的運動同步

時序圖如下:

客戶端0收到同步訊息時,計算出當前伺服器的狀態;然後我們並不能立即用這個狀態(會造成突兀抖動),需要進行插值平滑過渡到該狀態。

b. 本地玩家的運動同步

時序圖如下:

本地玩家端會立即響應使用者輸入,這樣會比伺服器端狀態提前。當沒有使用者輸入時,收到伺服器的同步校正資訊後,處理情況跟simulate模式相同。

要注意輸入的時間戳和伺服器傳送的輸入處理結果時間戳, 它們都是該客戶端的本地時間。

c. 上述情況的合成時序圖

將上述2個圖拼在一起進行觀察。

d.  我們還需要平滑地插值

為了避免出現抖動,我們都到伺服器的同步校正後,不能立即設定運動狀態,需要進行平滑過渡到該狀態。

再談網路遊戲同步

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

網路遊戲同步問題

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

網路遊戲同步問題

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