一:FPS歷史 傳統FPS遊戲,例如Quake或者half life, 採用狀態同步的機制,每個遊戲幀 50ms,服務器將會廣播每一個客戶端狀態變化,當客戶端收到狀態變化以後,根據時間進行插值預測,插值包括內插值和外插值,內插值即在兩幀之間插值 狀態,而外插值則爲預測將來。php
這種每幀同步的機制,能夠稱爲幀鎖。Quake中核心協議就兩條,1創造一個新的實體;2同步實體狀態。 在服務端將會存儲全部實體的當前狀態,而客戶端須要實現每一個實體的兩個基本狀態同步接口,即將當前狀態序列化,以及從服務器獲取序列化後的狀態。服務器
二:RTS 對於有大量單位的RTS遊戲,例如war3 魔獸爭霸,也是採用幀鎖的,可是不能採用狀態同步,而是採用了命令同步的機制,即客戶端首先發起命令,在該幀同步時,將命令發往服務器,服務器接受到全部客戶端命令,確認以後,廣播給全部客戶端,所以一般命令發起到執行須要必定時間,這段時間能夠是1frame或者2frame。 http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.php/接口
1:客戶端在相同的時間幀開始執行命令, 2:遊戲中全部的隨機採用相同的隨機種子。遊戲
每一個單位行爲都是肯定的,即在目標時間,到到目標位置,這也就要求了例如發射一個子彈,那麼發射初就已經知道了目標,而且知道了子彈多久命中目標。 即便目標移動了,命中和時間也不會改變。事件
主要問題是:客戶端不能當即響應用戶輸入,這時候須要客戶端預測。get
三:事件鎖 在mmo 裏面世界較大,單位比較多,通訊基本是發送message,消息報文,這個報文只在事件發生的時候發送。 例如移動事件,釋放技能事件,被擊事件,狀態同步和quake不一樣,quake傳遞的是每幀之間狀態的 delta變化,而事件有點相似於 命令。 可是存在一個問題,mmo裏面各個客戶端沒有一個統一frame鎖概念,客戶端執行相同命令,也不必定可以產生相同的輸出,所以須要按期對狀態進行強制同步。同步
例如客戶端發送移動命令給服務器,客戶端本身執行移動命令,同時服務器廣播移動命令; 服務器檢查移動命令正確,則不修改客戶端,不然若是不正確,則通知客戶端中止移動,或者修正移動的路點。 同步的話,客戶端經過加速執行命令便可。 由於在服務器上保存有最權威狀態,全部客戶端狀態不一致的時候,服務器強制同步。network