幀同步:
什麼是幀同步:幀同步常被rts(即時戰略)遊戲常採用。在遊戲中同步的是玩家的操作指令,操作指令包含當前的幀索引。一般的流程是客戶端上傳操作到伺服器, 伺服器收到後並不計算遊戲行為, 而是**到所有客戶端。這裡最重要的概念就是 相同的輸入 + 相同的時機 = 相同的輸出。
實現幀同步的流程一般是:
同步隨機數種子。(一般遊戲中都設計隨機數的使用, 通過同步隨機數種子,可以保持隨機數一致性)
客戶端上傳操作指令。(指令包括遊戲操作和當前幀索引)
伺服器廣播所有客戶端的操作。(如果沒有操作, 也要廣播空指令來驅動遊戲幀前進)。
因為幀同步的特性, 我們可以很方便的做出戰鬥回放:伺服器記錄所有操作, 客戶端請求到操作檔案再執行一次即可。
幀同步的特性導致客戶端的邏輯實現和表現實現必須完全分離。unity中的一些方法介面(如 invoke, update、動畫系統等)是不可靠的,所有要自己實現一套物理引擎、數學庫,做到邏輯和表現分離。 這樣即使unity的渲染是不同步的,但是邏輯跑出來是同步的。
狀態同步:
什麼是狀態同步:同步的是遊戲中的各種狀態。一般的流程是客戶端上傳操作到伺服器,伺服器收到後計算遊戲行為的結果,然後以廣播的方式下發遊戲中各種狀態,客戶端收到狀態後再根據狀態顯示內容。狀態同步最廣泛的應用應該是在回合制遊戲中。
狀態同步其實是一種不嚴謹的同步。它的思想中,不同玩家螢幕上的表現的一致性並不是重要指標, 只要每次操作的結果相同即可。所以狀態同步對網路延遲的要求並不高。像玩rpg遊戲,200-300ms的延遲也可以接受。 但是在rts遊戲中,50ms的延遲也會很受傷。
舉個移動的例子,在狀態同步中, 客戶端甲上操作要求從a點移動到b點,但在客戶端乙上, 甲物件從a移動到c,然後從c點移動到了b。這是因為, 客戶端乙收到a的移動狀態時, 已經經過了乙個延遲。這個過程中,需要客戶端乙本地做一些平滑的處理,最終達到移動到b點的結果。
遊戲中同步使用者狀態之
目的 了解遊戲中怎麼維護使用者狀態,和同步每個使用者狀態機制。傳統方案 輪詢方案 談起輪詢讓我想起,在開發用用到輪詢的方案 b s開發中怎麼理解伺服器端的輪詢 不論你是採用foreach thread.sleep xx 還是採用timer,這一類都可以歸結為輪詢的處理方案。這種方案不在b s開發中常...
遊戲中同步使用者狀態之
目的 了解遊戲中怎麼維護使用者狀態,和同步每個使用者狀態機制。傳統方案 輪詢方案 談起輪詢讓我想起,在開發用用到輪詢的方案 b s開發中怎麼理解伺服器端的輪詢 不論你是採用foreach thread.sleep xx 還是採用timer,這一類都可以歸結為輪詢的處理方案。這種方案不在b s開發中常...
狀態同步和幀同步
狀態同步 傳送操作給服務端。服務端處理計算邏輯,更新客戶端資料 幀同步 傳送操作給服務端。服務端中轉所有資料 通過隨機因子保證每次得出結果一樣 總結一下 1 對於回合制戰鬥來講,其實選用哪種方式實現不是特別重要了,因為本身實現難度不是很高,採用狀態同步也能實現離線戰鬥驗證。所以採用幀同步的必要性不是...