網絡游戲同步基礎
關鍵詞
- 幀同步
- 狀態同步
- LockStep
- Timebucket
- Timewarp
- Dead Reckoning
- Client-side Prediction
- Server-side Latency Compensation
- 延時、抖動、丟包率
- UDP vs. TCP
主流的網絡游戲同步方式一覽
-
MOBA
王者榮耀:幀同步
WAR3:幀同步
全民超神:狀態同步
亂斗西游:狀態同步
LOL:狀態同步
Dota2:狀態同步
-
MMO
MMO均采用狀態同步,如魔獸世界
-
FPS
FPS類游戲大多采用狀態同步
-
動作格斗類游戲
街機三國:幀同步
-
體育競技類游戲
NBA2K OL:幀同步
網絡游戲同步“大”分類
-
Peer-to-Peer Lockstep
早期的網絡拓撲模型
-
Client/Server
The Server is the Man
-
Client-Side Prediction
客戶端預測和延遲補償,“消除”網絡延遲
什么是幀同步?
War3/星際等采用,基于指令驅動各個客戶端自計算邏輯。服務端只管分發指令,每個客戶端根據完整的規則運算整個戰場。
每個客戶端播放效果就像是看視頻。
對視覺同步要求較高。
核心
保證所有客戶端每幀的輸入都一樣--同步性
相同的輸入下要有相同的輸出--確定性
優點
缺點
- 斷線需要補幀,即一旦你的戰場狀態沒有了,必須從頭開始,從第一個指令運算到連回去的戰場狀態。
什么是LockStep?
典型的一種幀同步算法,最早用于P2P。Lockstep把游戲過程劃分成了一個個turn,只有當每個turn集齊了所有玩家的操作指令,也就是輸入確定了之后,才可以進行計算,進入下一個turn,否則就要等待最慢的玩家。
使用Lockstep的游戲是嚴格按照turn向前推進的,如果有人延遲比較高,其他玩家必須等待該玩家跟上之后再繼續計算,不存在某個玩家領先或落后其他玩家若干個turn的情況。使用Lockstep同步機制的游戲中,每個玩家的延遲都等于延遲最高的那個人。
什么是Timebucket?
設置了 bucket的概念, 執行每一幀的時間是固定的 bucket 時間節點, 而不必等到收到所有的 client step 指令, 從而網絡不再受最差的 client 限制.
什么是狀態同步?
MMORPG的主要實現方式,服務器負責計算全部的游戲邏輯,并且廣播這些計算的結果,客戶端僅僅負責發送玩家的操作,以及表現收到的游戲結果。一般來說,玩家發送一個操作到服務器上,服務器根據玩家操作去修改內存中的游戲世界模型,同時運算游戲世界對這個操作的反應,然后把這些反應都廣播給相關的多個客戶端,每個客戶端負責把這些數據表現出來給玩家看。
一句話,The Server is the Man!
什么是DR?
Dead Reckoning,導航推測算法,即客戶端模擬運動軌跡和路線,如果真實坐標和模擬坐標的差值大于某個極限誤差的時候則廣播,收到消息后進行平緩的拉扯處理。
屬于客戶端預測。
什么是Timewarp?
客戶端先行,發現邏輯不一致的時候,進行回滾。
什么是延遲補償?
服務器端考慮了客戶端的網絡延遲,將服務器狀態回滾到延遲前,再進行運算。
什么是延時、抖動、丟包率?
ping kingsoft.cn
正在 Ping kingsoft.cn [192.168.12.19] 具有 32 字節的數據:
來自 192.168.12.19 的回復: 字節=32 時間=5ms TTL=123
來自 192.168.12.19 的回復: 字節=32 時間=6ms TTL=123
來自 192.168.12.19 的回復: 字節=32 時間=5ms TTL=123
請求超時。
192.168.12.19 的 Ping 統計信息:
數據包: 已發送 = 4,已接收 = 3,丟失 = 1 (25% 丟失),
往返行程的估計時間(以毫秒為單位):
最短 = 4ms,最長 = 6ms,平均 = 5ms
______________________________________
注:延時5ms
抖動:(4ms-5ms)~(6ms-5ms),即-1ms~+1ms,[最短延時-平均延時] ~ [最長延時-平均延時]
丟包率:25%
如何選擇協議?
TCP vs. UDP
亂斗西游采用的是UDP
NBA2K OL存在用的是UDP
補充一句:使用哪種同步方式和協議方式沒有必然聯系;比如亂斗西游是UDP+狀態同步,而街機三國是TCP(TCP_NODELAY) + 幀同步
注:可參考本人的上一篇文章:
Networking Basics:TCP and UDP Basics
幀同步如何防外掛?
如果初始狀態一樣和隨機種子一樣,那么只要每幀的輸入高度一樣(因為是由服務器切幀分發的,可以保持每個客戶端的輸入序列是一樣的),那么每幀的運算結果也是一樣的。為此讓每個客戶端驗證每幀的結果是不是與其它幾個客戶端是一模一樣的,我們就可以拿來做為校驗原因。只要有不一樣的結果,即有人做弊。
為什么MMO不能用幀同步?
幀同步的[所有人]的輸入必須在[所有客戶端]進行計算,這樣大家運算出來的結果才能一樣,才能保證幀同步.注意是【所有人】.所以常見用于rts,moba、2k等房間游戲.因為人數固定.但是mmo中玩家不定,如果同步所有人。。這個帶寬(即傳輸問題)。。所以mmo中用狀態同步+aoi視野管理.
References
posted on 2016-06-13 18:54
landon 閱讀(3395)
評論(0) 編輯 收藏 所屬分類:
GameServer