帧同步
【幀同步】
1、RTS游戲有很多,比如我們都玩過的的Warcraft III(大家耳熟能詳的Dota是它的一張地圖)和StarCraft,還有EA的代表作命令與征服系列(Command & Conquer)等等,以及現在非常流行的Dota2和LOL。
早期廣泛在RTS(即時策略)游戲中應用的同步機制——Lockstep。
那么為什么要強調早期呢?因為Dota2和LOL等新興的游戲使用的同步機制不再是傳統的Lockstep了。嚴格來說,Warcraft和現在意義上的網游有很大區別,因為它所謂的網是局域網(LAN)。早期RTS游戲出現時互聯網還沒有現在那么普及,網速也很慢,更沒有什么像樣的網游,能夠支持局域網對戰已經很不錯了。
有人可能會有疑問,我們平時經常在對戰平臺上和全國各地的人打Dota,你為什么說Warcraft III只支持局域網呢?這又是一個很有意思的話題,實際上,對戰平臺使用了虛擬局域網(VLAN)技術,通過進程注入,HOOKWinSock函數調用,將數據包發送到對戰平臺服務器上,由服務器分配虛擬IP,這里還能夠進行天梯匹配等等,在隨后的游戲過程中游戲數據包都是通過對戰平臺的服務器進行轉發,但是這一切對Warcraft III進程本身來說是透明的,它依然感覺自己在一個局域網環境中。
Lockstep中會不會出現延遲導致的不一致問題?顯然不會,使用Lockstep的游戲是嚴格按照turn向前推進的,如果有人延遲比較高,其他玩家必須等待該玩家跟上之后再繼續計算,不存在某個玩家領先或落后其他玩家若干個turn的情況。使用Lockstep同步機制的游戲中,每個玩家的延遲都等于延遲最高的那個人。
Lockstep是非常嚴格的,要求每一步的的計算結果都完全一樣,任何計算錯誤都有可能導致蝴蝶效應,產生嚴重的后果,因為狀態不能同步的話游戲根本就沒有辦法進行下去,最終將崩潰退出。
2、追幀時,表現層應當一幀一幀依次快速播放,就像邏輯怪一幀一幀快速計算一樣,而不能直接從當前幀狀態插值到最終幀狀態。
例如下圖,F1->F2->F3,F1幀時在A位置,F2幀時到B位置,F3幀時到C位置。如果F1幀過了很長時間同時收到F2和F3包,如果表現層直接從F1狀態A位置插值到F3狀態的C位置,則會穿越中間的黑色障礙物。好的解決方法是表現層也采用追幀模式,快速播放。
3、隨機問題
Dota中有許多問題是與概率相關的,比如整點時野怪是隨機刷新的,出了水晶劍之后是有概率暴擊的。那么按照Lockstep同步機制,計算都是在每個玩家自己電腦上完成的,那么在有概率存在的情況下,怎么可能保證每臺電腦的計算結果一致呢?!這時就輪到偽隨機數派上用場了。
大部分編程語言內置庫里的隨機數都是利用線性同余發生器產生的,如果不指定隨機種子(Random Seed),默認以當前系統時間戳作為隨機種子。一旦指定了隨機種子,那么產生的隨機數序列就是確定的。
所以,游戲開始前,參與游戲的玩家電腦協商確定一個隨機種子,就可以保證在游戲進行過程中大家產生的隨機數序列是相同的,也就可以保證計算結果一致。
例如一個英雄的暴擊率為30%,對某個目標持續普攻,如果隨機數序列為12 32 90 25,小于等于30判定暴擊,大于30判定不暴擊,那么每個玩家電腦的計算結果都是暴擊 不暴擊 不暴擊 暴擊。
4、udp的可靠性。
我們可以知道udp主要在可靠性上主要是不能保證數據包的順序,比如第100個收到的數據包并不一定是第100個發出的數據包,同時也無法保證不丟包,期間有一個包丟失,udp本是也不會去校檢。如果這兩個問題解決了,udp的大部分可靠性問題也就解決了。
為每個數據包增加序列號,每發一次包,增加本地序號。
5、經典的 Lockstep 流程如下。
上圖中我們可以明顯看到,這種囚徒模式的幀同步,在第二幀的時候,因為玩家1有延遲,而導致第二幀的同步時間發生延遲,從而導致所有玩家都在等待,出現卡頓現象。
6、檢測同步。
帝國時代和最高指揮官會在每邏輯幀計算當前所有單位的屬性的crc值,幾個客戶端之間比較這個crc值,如果發現不一致,那么就是不同步現象。此時可以把不同步的客戶端踢出游戲。
7、不公平問題。
如果一幀中,輸入無序,會導致重大問題。如A射擊B,同一幀內,B也射擊A。
如果先計算A射擊B,則B死了,A贏了。
如果先計算B射擊A,則A死了, B贏了。
所以幀同步無法做到真正的公平。上述情況下,如果處理輸入有序,則A、B必有一方占優。
參考:
1、http://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockstep/
2、http://www.sohu.com/a/153269736_163917
3、http://blog.csdn.net/langresser_king/article/details/46756393
總結
- 上一篇: 骨折多少天走路才能回到原来那样(骨折多少
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?