什麼是幀同步:幀同步常被rts(即時戰略)遊戲常採用。在遊戲中同步的是玩家的操作指令,操作指令包含當前的幀索引。一般的流程是客戶端上傳操作到伺服器, 伺服器收到後並不計算遊戲行為, 而是**到所有客戶端。這裡最重要的概念就是 相同的輸入 + 相同的時機 = 相同的輸出。
實現幀同步的流程一般是:
同步隨機數種子。(一般遊戲中都設計隨機數的使用, 通過同步隨機數種子,可以保持隨機數一致性)
客戶端上傳操作指令。(指令包括遊戲操作和當前幀索引)
伺服器廣播所有客戶端的操作。(如果沒有操作, 也要廣播空指令來驅動遊戲幀前進)。
因為幀同步的特性, 我們可以很方便的做出戰鬥回放:伺服器記錄所有操作, 客戶端請求到操作檔案再執行一次即可。
幀同步的特性導致客戶端的邏輯實現和表現實現必須完全分離。unity中的一些方法介面(如 invoke, update、動畫系統等)是不可靠的,所有要自己實現一套物理引擎、數學庫,做到邏輯和表現分離。 這樣即使unity的渲染是不同步的,但是邏輯跑出來是同步的。
什麼是狀態同步:同步的是遊戲中的各種狀態。一般的流程是客戶端上傳操作到伺服器,伺服器收到後計算遊戲行為的結果,然後以廣播的方式下發遊戲中各種狀態,客戶端收到狀態後再根據狀態顯示內容。狀態同步最廣泛的應用應該是在回合制遊戲中。
狀態同步其實是一種不嚴謹的同步。它的思想中,不同玩家螢幕上的表現的一致性並不是重要指標, 只要每次操作的結果相同即可。所以狀態同步對網路延遲的要求並不高。像玩rpg遊戲,200-300ms的延遲也可以接受。 但是在rts遊戲中,50ms的延遲也會很受傷。
舉個移動的例子,在狀態同步中, 客戶端甲上操作要求從a點移動到b點,但在客戶端乙上, 甲物件從a移動到c,然後從c點移動到了b。這是因為, 客戶端乙收到a的移動狀態時, 已經經過了乙個延遲。這個過程中,需要客戶端乙本地做一些平滑的處理,最終達到移動到b點的結果。
比較:狀態同步
幀同步流量
相對高相對低
回放記錄檔案大
記錄檔案小
安全性伺服器實現邏輯,安全性高
邏輯在客戶端,反外掛程式壓力大、無法避免開圖掛
伺服器壓力大小
戰鬥校驗
協議加密,記憶體混肴,誤差校驗,無法徹底解決。
伺服器可以重啟跑一遍戰鬥。
網路卡頓的表現
瞬移,回位,莫名掉血
戰鬥卡頓
實現調優狀態同步方式,客戶端需要做插值處理。
客戶端按照單機方式開發,保證邏輯層和表現層分離。邏輯層不要用到浮點數,不要用不確定順序的邏輯結構。對於物理引擎和浮點數計算要不能使用unity的。
選擇:對於單位比較多的即時策略遊戲,幀同步是很好的選擇。反過來,如果玩家比較多,狀態同步更合適,安全性更高。
狀態同步和幀同步
狀態同步 傳送操作給服務端。服務端處理計算邏輯,更新客戶端資料 幀同步 傳送操作給服務端。服務端中轉所有資料 通過隨機因子保證每次得出結果一樣 總結一下 1 對於回合制戰鬥來講,其實選用哪種方式實現不是特別重要了,因為本身實現難度不是很高,採用狀態同步也能實現離線戰鬥驗證。所以採用幀同步的必要性不是...
幀同步和狀態同步
實時遊戲發展迅猛,同步技術也逐漸成為解決方案的核心之一。本文簡單討論了幀同步和狀態同步。什麼是幀同步 幀同步常被rts 即時戰略 遊戲常採用。在遊戲中同步的是玩家的操作指令,操作指令包含當前的幀索引。一般的流程是客戶端上傳操作到伺服器,伺服器收到後並不計算遊戲行為,而是 到所有客戶端。這裡最重要的概...
幀同步和狀態同步
伺服器負責轉化客戶端的操作,每個客戶端在固定的邏輯幀執行該幀所有客戶端的操作命令,通過在嚴格一致的時間軸上執行同樣的命令序列得到同樣的結果。伺服器按幀 客戶端的操作,客戶端進行確定性運算和一致性模擬 伺服器承載所有計算,客戶端只做表現。主流的大型mmo遊戲都採用狀態同步。幀同步狀態同步 一致性邏輯上...