揭祕RTS遊戲中的同步機制
RTS遊戲有很多,可能大家比較熟悉的有Warcraft III和 StarCraft,帶給我們無限的歡樂和回憶。還有當下比較流行lol與dota2,實際上都是孫子輩的遊戲了。RTS遊戲同步很重要,而且同步也能非常穩定地實現。那麼他們到底是怎麼做到高頻操作又同步的呢?下面由yjbys小編來為大家解惑。想了解更多相關資訊請持續關注我們應屆畢業生培訓網。
同步機制假設遊戲中A,B兩個玩家移動,並同時向對方發出射擊指令,如果沒有合適的同步機制,那麼可能出現的情況有:
· A螢幕顯示B已經被殺死,B螢幕顯示A已經被殺死
· 或者在瞄準後確打不到對方
因為網路是有延時的,而每個玩家的網路情況都不盡相同。還有每幀渲染的延遲(早期的計算機效能不夠好的時候 會出現這個問題)
同步機制最重要的作用就是解決延遲等可能發生不一致的情況。
同步機制的分類Peer-to-peer模式
沒有伺服器,每個玩家互相連線,各自模擬整個流程.典型的lockstep模式
優點:減少主機帶來的延時
缺點:容易作弊
Client-Server模式
所有的操作需經過伺服器確認後才能進行客戶端模擬,如arpg傳奇類都是此架構,如果延時高就會有明顯的卡頓。
優點:伺服器是絕對的權威,可以防止作弊,可以做更多的管理與限制
缺點:伺服器變的更復雜,伺服器斷線,所有玩家斷線,屬於伺服器依賴型。
早期的RTS遊戲大多采用Lockstep方案來設計,像羅馬帝國,沙丘之類。
就是說玩家的資料每個時間段同步一次,同步的走。
標準的lockstep模式
· 每個玩家互相連線,整個遊戲過程劃分成一組turn指令幀,由玩家自我模擬
· 遊戲速度取決於網路最慢的那個玩家
· 一個玩家掉線不會影響到其他玩家
什麼是Turn?一個turn可以理解成1個回合,相信大家都玩過回合制遊戲吧,只是這個turn非常短,大概100MS-200MS。玩家相互之間傳送的指令在每個turn間隔發出。
每個玩家只需要接收指令,並在本地播放指令就可以啦。
War3如何運算傷害?玩家到底是傳送什麼指令到主機,主機到底參與了什麼計算呢?
實際上玩家都只需要傳送基本的指令如選擇單位,移動單位,使用技能1234,點選物品欄1-6,可以通過APM檢視 軟體看到一些基本操作事件。
也就是說所有的一切傷害計算都是在本地計算完成的。
包括傷害,暴擊,命中,刷怪等,只要初始化好隨機數種子就可以啦。
玩家只是傳送操作指令,如點選座標(0,1, 0),左鍵框選(100,100,50,50)等。
每個玩家都在模擬全部的流程。
那麼War3到底算不算使用lockstep模式,或者是特殊的client-server?
其實可以通過幾個問題判斷出:
· 非主機玩家卡是否可以影響到其他玩家,如果不會,那麼更可能是client-server模式
· 可以通過抓包工具攔截網路資料包的流向,來判斷是否是peer to peer的連線方式還是隻連線到主機(或通過主機強制掉線方式判斷)。
個人也認為War3是基於Client-Server的一種的特殊模式,主機肯定需要驗證一些邏輯。
主機負責廣播每個client的指令,
這存在兩個問題:
· 本機(非主機)發出的指令,如果超時或者丟包,是否直接丟棄?
· 其他玩家的`指令,主機轉發未成功確認,如何處理?
第一個問題
1.如果是本機(非主機)發出的指令超時,可以直接丟棄。(如果不丟棄,其他玩家就必須等待結果,這樣會導致掛起,而且會非常頻繁,這裡還有udp協議容易丟包的原因,但是war3好像並沒有經常性的掛起)
還有一種可能,客戶端得知之前的turn沒有傳送成功,把當前這輪的指令和上一輪的指令進行合併,然後一起發出,這樣本地客戶端就不會有任何的異樣了。
例如玩家移動到A後再移動到B
上個turn的指令是移動到A點,但是沒有發成功,下個turn的指令先移動到A,再移動到B,這樣在客戶端就不會有 丟失的感覺啦,還是可以正常的模擬而不會影響到其他玩家。
2. 收其他玩家的指令超時,那麼屬於我們自身網路的問題,如果丟棄必將導致遊戲程序不同步,所以伺服器必須將他們的turn指令都快取起來,
或者快取一部分turn指令集,在我網路穩定的時候,把丟失的那一部分turn指令集發給我,而我只需要下載那個list加快gameupdate就好啦。
關於外掛的問題
相信玩過魔獸的人基本都用過,實際上像戰爭迷霧,顯示單位等只會儲存一個狀態值在記憶體中,只要定位到記憶體地址,改一下變數值就好了,一般是伺服器是不會檢測這個的。
而攻擊力,道具數量等,由於大家都需要模擬,你本地修改了,會影響到其他人,程式就會發生蝴蝶效應。
至於現在非常流行的 Dota2 和 英雄聯盟,會額外的加入更多伺服器來驗證和計算一些外部資料,但內部原理是一致的,早期的遊戲與現在的網遊不可同日而語。