生活随笔
收集整理的這篇文章主要介紹了
网络游戏同步基础
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
http://www.zhust.com/index.php/2014/02/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E7%9A%84%E7%A7%BB%E5%8A%A8%E5%90%8C%E6%AD%A5%EF%BC%88%E4%B8%80%EF%BC%89%E7%BD%91%E7%BB%9C%E5%90%8C%E6%AD%A5%E6%BC%94%E7%A4%BA/#comment-4847
關(guān)鍵詞
幀同步 狀態(tài)同步 LockStep Timebucket Timewarp Dead Reckoning Client-side Prediction Server-side Latency Compensation 延時(shí)、抖動、丟包率 UDP vs. TCP
主流的網(wǎng)絡(luò)游戲同步方式一覽
MOBA ? ??王者榮耀:幀同步 ? ??WAR3:幀同步 ? ??全民超神:狀態(tài)同步 ? ??亂斗西游:狀態(tài)同步 ? ??LOL:狀態(tài)同步 ? ??Dota2:狀態(tài)同步 MMO ? ??MMO均采用狀態(tài)同步,如魔獸世界 FPS ? ??FPS類游戲大多采用狀態(tài)同步 動作格斗類游戲 ? ??街機(jī)三國:幀同步 體育競技類游戲 ? ??NBA2K OL:幀同步
網(wǎng)絡(luò)游戲同步“大”分類
Peer-to-Peer Lockstep ? ??早期的網(wǎng)絡(luò)拓?fù)淠P?/span> Client/Server ? ??The Server is the Man Client-Side Prediction ? ??客戶端預(yù)測和延遲補(bǔ)償,“消除”網(wǎng)絡(luò)延遲
什么是幀同步?
War3/星際等采用,基于指令驅(qū)動各個客戶端自計(jì)算邏輯。服務(wù)端只管分發(fā)指令,每個客戶端根據(jù)完整的規(guī)則運(yùn)算整個戰(zhàn)場。
每個客戶端播放效果就像是看視頻。
對視覺同步要求較高。
核心
保證所有客戶端每幀的輸入都一樣--同步性
相同的輸入下要有相同的輸出--確定性
優(yōu)點(diǎn)
因?yàn)橹恍枰街噶?#xff0c;所以流量消耗非常小
缺點(diǎn)
斷線需要補(bǔ)幀,即一旦你的戰(zhàn)場狀態(tài)沒有了,必須從頭開始,從第一個指令運(yùn)算到連回去的戰(zhàn)場狀態(tài)。
什么是LockStep?
典型的一種幀同步算法,最早用于P2P。Lockstep把游戲過程劃分成了一個個turn,只有當(dāng)每個turn集齊了所有玩家的操作指令,也就是輸入確定了之后,才可以進(jìn)行計(jì)算,進(jìn)入下一個turn,否則就要等待最慢的玩家。
使用Lockstep的游戲是嚴(yán)格按照turn向前推進(jìn)的,如果有人延遲比較高,其他玩家必須等待該玩家跟上之后再繼續(xù)計(jì)算,不存在某個玩家領(lǐng)先或落后其他玩家若干個turn的情況。使用Lockstep同步機(jī)制的游戲中,每個玩家的延遲都等于延遲最高的那個人。
什么是Timebucket?
設(shè)置了 bucket的概念, 執(zhí)行每一幀的時(shí)間是固定的 bucket 時(shí)間節(jié)點(diǎn), 而不必等到收到所有的 client step 指令, 從而網(wǎng)絡(luò)不再受最差的 client 限制.
什么是狀態(tài)同步?
MMORPG的主要實(shí)現(xiàn)方式,服務(wù)器負(fù)責(zé)計(jì)算全部的游戲邏輯,并且廣播這些計(jì)算的結(jié)果,客戶端僅僅負(fù)責(zé)發(fā)送玩家的操作,以及表現(xiàn)收到的游戲結(jié)果。一般來說,玩家發(fā)送一個操作到服務(wù)器上,服務(wù)器根據(jù)玩家操作去修改內(nèi)存中的游戲世界模型,同時(shí)運(yùn)算游戲世界對這個操作的反應(yīng),然后把這些反應(yīng)都廣播給相關(guān)的多個客戶端,每個客戶端負(fù)責(zé)把這些數(shù)據(jù)表現(xiàn)出來給玩家看。
一句話,The Server is the Man!
什么是DR?
Dead Reckoning,導(dǎo)航推測算法,即客戶端模擬運(yùn)動軌跡和路線,如果真實(shí)坐標(biāo)和模擬坐標(biāo)的差值大于某個極限誤差的時(shí)候則廣播,收到消息后進(jìn)行平緩的拉扯處理。
屬于客戶端預(yù)測。
什么是Timewarp?
客戶端先行,發(fā)現(xiàn)邏輯不一致的時(shí)候,進(jìn)行回滾。
什么是延遲補(bǔ)償?
服務(wù)器端考慮了客戶端的網(wǎng)絡(luò)延遲,將服務(wù)器狀態(tài)回滾到延遲前,再進(jìn)行運(yùn)算。
什么是延時(shí)、抖動、丟包率?
ping kingsoft.cn
正在 Ping kingsoft.cn [192.168.12.19] 具有 32 字節(jié)的數(shù)據(jù):
來自 192.168.12.19 的回復(fù): 字節(jié)=32 時(shí)間=5ms TTL=123
來自 192.168.12.19 的回復(fù): 字節(jié)=32 時(shí)間=6ms TTL=123
來自 192.168.12.19 的回復(fù): 字節(jié)=32 時(shí)間=5ms TTL=123
請求超時(shí)。
192.168.12.19 的 Ping 統(tǒng)計(jì)信息:
數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 3,丟失 = 1 (25% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
最短 = 4ms,最長 = 6ms,平均 = 5ms
______________________________________
注:延時(shí)5ms
抖動:(4ms-5ms)~(6ms-5ms),即-1ms~+1ms,[最短延時(shí)-平均延時(shí)] ~ [最長延時(shí)-平均延時(shí)]
丟包率:25%
如何選擇協(xié)議?
TCP vs. UDP
亂斗西游采用的是UDP
NBA2K OL存在用的是UDP
補(bǔ)充一句:使用哪種同步方式和協(xié)議方式?jīng)]有必然聯(lián)系;比如亂斗西游是UDP+狀態(tài)同步,而街機(jī)三國是TCP(TCP_NODELAY) + 幀同步 注:可參考本人的上一篇文章: Networking Basics:TCP and UDP Basics
幀同步如何防外掛?
如果初始狀態(tài)一樣和隨機(jī)種子一樣,那么只要每幀的輸入高度一樣(因?yàn)槭怯煞?wù)器切幀分發(fā)的,可以保持每個客戶端的輸入序列是一樣的),那么每幀的運(yùn)算結(jié)果也是一樣的。為此讓每個客戶端驗(yàn)證每幀的結(jié)果是不是與其它幾個客戶端是一模一樣的,我們就可以拿來做為校驗(yàn)原因。只要有不一樣的結(jié)果,即有人做弊。
為什么MMO不能用幀同步?
幀同步的[所有人]的輸入必須在[所有客戶端]進(jìn)行計(jì)算,這樣大家運(yùn)算出來的結(jié)果才能一樣,才能保證幀同步.注意是【所有人】.所以常見用于rts,moba、2k等房間游戲.因?yàn)槿藬?shù)固定.但是mmo中玩家不定,如果同步所有人。。這個帶寬(即傳輸問題)。。所以mmo中用狀態(tài)同步+aoi視野管理.
References
what-every-programmer-needs-to-know-about-game-networking/ lockstep 1500 Archers on a 28.8 understanding fighting game networking 亂斗西游技術(shù)演講 騰訊如何打造一款實(shí)時(shí)對戰(zhàn)手游 自研游戲幀同步方案 NBA2KOnline如何網(wǎng)絡(luò)同步優(yōu) 前網(wǎng)易林偉同步文章系列 知乎關(guān)于moba類游戲同步的探討
總結(jié)
以上是生活随笔 為你收集整理的网络游戏同步基础 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。