1. 程式人生 > >什麽是遊戲中的幀同步

什麽是遊戲中的幀同步

提高 服務 顯示 多個 網絡數 操作 導致 其他 方式

遊戲中的幀同步是一種客戶端與服務器的同步方式,是為了實現高實時性的需求而設計的。在實時pvp遊戲中,要求每個客戶端高度同步,怎麽做到精確的同步呢,那就是向同步的所有客戶端廣播同步消息。由於網絡存在延遲,因此一個客戶端發送消息給服務器的過程存在延遲,服務器廣播同步消息給其他客戶端也存在延遲,為了降低這個延遲,服務器應該盡量減少邏輯,快速地轉發消息讓客戶端能夠同步,因此在幀同步中,遊戲的邏輯計算應該放到客戶端來實現,服務器在收到消息後應該迅速地進行廣播,而不應該做過多的邏輯計算。既然是客戶端進行計算,那客戶端在實現用戶操作後,把操作後的狀態進行同步可行不可行呢?答案是不可行,因為如果客戶端先對用戶指令進行計算再同步狀態的話,狀態信息到達其他客戶端有一個網絡延遲,這個延遲會導致收到消息的客戶端的邏輯會滯後於發送消息的客戶端。為了消除網絡延遲,讓所有客戶端都同步顯示,客戶端應該發送的消息是一個指令集,指令集表示一個客戶端進行了什麽操作,然後這個指令集廣播給所有客戶端,假如所有客戶端網絡延遲差距不大,那麽各個客戶端收到指令的時間應該是非常接近的,客戶端收到指令後進行邏輯計算,同樣的計算得到同樣的邏輯結果,這樣就實現了各個客戶端的同步顯示。這裏為了達到同樣的計算得到同樣結果的目的,對於隨機數,我們應該保證各個客戶端種子相同。遊戲中玩家的操作指令集轉化為網絡數據流往往是比較小的,因此為了提高網絡利用率,我們應該使得多個指令集轉化為一個數據包進行發送,因此服務器在收到客戶端指令後應該緩存起來,等待一個時間和其他指令集一起廣播給其他客戶端。這個時間叫做一個幀,因此這個同步過程取名為幀同步。由於幀同步是不同步狀態,只同步指令的,因此對於每個客戶端來說為了同步,必須收到和其他客戶端同樣的指令集,不能有指令集丟失的情況發生,因為一旦指令集不同,計算得出的結果顯示就不同,各個客戶端自然就不同步。所有在網絡傳輸的時候我們要選擇有重傳機制的通信協議,如tcp或udp+kcp。假如網絡很差,導致客戶端斷線了,那麽當斷線客戶端重連的時候,為了與其他客戶端同步,他需要知道其他客戶端在他斷線的時間內做了什麽操作,所以服務器應該把他斷線期間內所有的指令都發給重連的客戶端,因此服務器需要緩存所有指令,直到幀同步結束。

什麽是遊戲中的幀同步