1. 程式人生 > 其它 >網路遊戲開發之同步模式

網路遊戲開發之同步模式

網路遊戲開發之同步模式

網路遊戲如何實現所有客戶端玩家資訊同步?(如吃雞中所有玩家的位置同步)

同步模式一般分兩種:狀態同步和幀同步。

狀態同步:狀態發生變化後,客戶端上傳操作到伺服器,伺服器收到後處理行為的結果,然後以廣播的方式把狀態傳送給客戶端,客戶端收到狀態後再根據狀態顯示內容。
如:吃雞等大地圖遊戲、MMO遊戲、因為MMO遊戲的客戶端承載有限,並不能把整張地圖的實體全部展現出來。

幀同步:每一幀都要同步,每個客戶端通過拿到相同的狀態和指令,按幀順序執行,達到同步效果。
如:LOL、王者榮耀等

二者區別:

1、狀態同步的戰鬥邏輯在服務端,而幀同步的戰鬥邏輯在客戶端,服務端只轉發操作,不做任何邏輯處理。
2、狀態同步比幀同步流量消耗大,伺服器壓力比較大,因為要做更多運算。
3、狀態同步的安全性比幀同步高很多,因為狀態同步的所有邏輯和數值都是在服務端的,而幀同步因為所有資料全部在客戶端,所以解析客戶端的資料之後就很容易作弊。
4、狀態同步開發起來比較難,一個功能至少需要一個客戶端和服務端共同完成;

回放&觀戰
幀同步的回放&觀戰比狀態同步好做得多,因為只需要儲存每局所有人的操作就好了,而狀態同步的回放&觀戰,需要有一個回放&觀戰伺服器,當一局戰鬥打響,戰鬥伺服器在給客戶端傳送訊息的同時,還需要把這些訊息發給放&觀戰伺服器,回放&觀戰伺服器做儲存,如果有其他客戶端請求回放或者觀戰,則回放&觀戰伺服器把儲存起來的訊息按時間發給客戶端。

斷線重連
狀態同步的斷線重連,就是把整個場景和人物全部重新生成一遍,各種數值根據服務端提供加到角色身上。
幀同步的斷線重連就比較麻煩了,服務端要把斷線時間內的所有訊息一次性發給客戶端,然後客戶端加速整個遊戲的核心邏輯執行速度(timeScale),直到追上現有進度。因為計算邏輯在客戶端,一旦跳過某些幀數,很容易出問題。

注意:
需要保證每次隨機的數字都相同,所以需要自己實現一套隨機數,不能用unity自帶的那個隨機數介面,而且需要服務端傳送相同的隨機種子;
所有float型的引數必須變成int型,因為非常微小的誤差就有可能產生蝴蝶效應,保證計算結果一致。