簡述
游戲中的幀同步是一種客戶端與服務器的同步方式,是為了實現高實時性,高同步性的應用而產生的。例如大家喜歡玩的王者榮耀,如果玩家A對玩家B發出了攻擊而玩家B過了很久才發現,那么玩家B很可能就來不及做出防御,那這個游戲就沒法玩,所以所有玩家的指令一定是要及時地同步到所有玩家的終端上的,而且大家收到的信息一定要是一致的,不然沒法玩。
-實時性
網絡存在延遲,客戶端發出指令到服務器需要時間,服務器發送指令到其他客戶端也需要時間,為了做到讓玩家感覺不出來延遲,這個發送消息的周期一定要短,例如我50ms就同步一次信息,加上網絡延遲100ms,150ms的延遲,玩家是反應不過來的,這個延遲對於玩家來說是越小越小,但是對於運營成本,同步消息頻率越大,對於性能要求越高,成本也就越高,所以是要做一個權衡。而且為了能夠減小服務器的壓力,也為了能夠更快地轉發信息,游戲的邏輯一般會放到客戶端去執行,這樣更快。
-同步性
客戶端需要將指令同步后然后在固定的幀間隔內進行邏輯計算,而不是將邏輯計算好了再發送到其他客戶端,原因是在某一幀內,玩家如果在不知道其他用戶的操作的情況下進行邏輯計算的話,會造成計算結果的不一致,比如說一幀內玩家A攻擊了B導致B死亡而這一幀內B也攻擊了A導致A死亡,那么兩個客戶端都認為對方死了,實際上通過指令同步后進行計算,只會有一個死。那就是最先發起攻擊的那個人。
如果使用同步指令后再計算的模式,那么需要保證的是每個客戶端收到相同指令都會運行出唯一的結果,為了保證這一點,所有客戶端都應該有相同的隨機種子,也就是說如果有需要隨機的地方,那么每個客戶端都應該隨機出同一個結果,比如玩家A擲骰子,那么每個客戶端那里玩家A都應該擲出相同的數字。
指令是不能丟失的,丟失后就會有客戶端計算的結果不一致了,所以網絡傳輸必須使用有數據可靠性保證的傳輸方式,例如tcp,例如kcp。
為了應對玩家掉線的情況,服務器應該保存一場游戲中的指令,在玩家斷線重連后發送到玩家終端。