總結moba遊戲與皇室戰爭類遊戲幀同步區別
之前公司做一款類皇室戰爭遊戲,實時性操作要求不是那麼強,最近在找工作,自己做了一個demo,模仿王者榮耀的moba遊戲,實時性操作非常強,兩個遊戲都是幀同步,因為實時操作的問題,導致兩個專案架構有很大不同。例如:伺服器給客戶端同步間隔時長,客戶端邏輯層驅動,操作執行時間各不相同等。今天總結一下。
1. 類皇室戰爭遊戲:
直接說架構了,稍後再進行解釋。伺服器每間隔一個關鍵幀:200ms也就是4個邏輯幀,向房間內所有玩家推送上個關鍵幀內,所有玩家的操作資訊,和該關鍵幀的幀號。客戶端會根據伺服器傳送過來的關鍵幀幀號推算出伺服器幀同步開始時的開始時間戳。然後根據這一時間,客戶端本地也進行邏輯幀同步計時,客戶端每間隔一個邏輯幀就把自身邏輯幀計數器加一。玩家操作的時候,客戶端根據當前幀 + 一個關鍵幀 + 網路延遲幀,計算出該操作的執行幀,然後把操作訊息立刻傳送給伺服器。當到達執行幀的時候,客戶端執行操作。客戶端邏輯幀的驅動嚴格意義上說,不是靠伺服器來驅動的,是靠客戶端本地的邏輯幀計數,來驅動的。伺服器發來的關鍵幀,只是用來同步操作。
為什麼這樣設計呢?
1). 因為塔防類遊戲玩家操作不會很頻繁
2). 建造的建築,開始出兵不是建造完之後立馬出兵的,是等待每一個回合開始的時候,才開始出兵。這就使得對客戶端操作的相應可以等待伺服器下一個關鍵幀傳來的時候,在執行。
3). 如果客戶端邏輯幀改成伺服器驅動,那伺服器就得每一邏輯幀都向客戶端推送訊息,消耗的流量肯定很大,而且沒有必要。
綜合上面的原因上個專案,同步架構設計為:伺服器間隔四個邏輯幀向客戶端推送操作訊息,客戶端每一個邏輯幀處理由本地驅動。
2.moba遊戲(我自己的demo):
設計架構:
伺服器每間隔一個邏輯幀(50ms)向客戶端推送操作訊息,客戶端每一個邏輯幀處理完全由伺服器驅動。玩家搖桿控制訊息會很頻繁的傳送給伺服器,優化為客戶端間隔50ms將玩家在此50ms內進行的操作,傳送給伺服器。
這樣設計的原因:
1. 搖桿控制的moba遊戲,玩家操作頻繁,而且必須儘可能快有反饋,這就要求伺服器必須將玩家操作儘快推送出去。
2. 玩家進行的搖桿控制,操作太過於頻繁,如果每次都直接向伺服器傳送操作,會導致傳輸流量過大。客戶端每間隔50ms,傳送一次。而且,還有一個優化,如果客戶端按住一個方向不動,不鬆手,而且不改變方向,就不會發送操作,只有在方向改變的情況下才傳送。
總結:
兩種方案不同之處:
1. 客戶端邏輯幀處理的驅動不一樣,類皇室是靠客戶端自身驅動,moba是靠伺服器驅動。
2. 玩家進行操作的頻率不同,導致操作命令執行的時間不同,類皇室的執行幀數是當前幀 + 關鍵幀 + 網路延遲等幀數,moba是客戶端收到訊息立馬執行
3. 玩家進行操作後,客戶端傳送把玩家操作指令給伺服器的即時性不同:類皇室是立即傳送,moba是客戶端50ms(一個邏輯幀)傳送一次。這樣也就是說moba遊戲執行幀是當前幀 + 一個邏輯幀 + 網路延遲幀。
這就是兩個專案幀同步方面,給我的一些啟示,每一個專案,根據需求、玩法的不同,有不同的方案架構,只由最符合專案要求的方案才是最好的方案。