《Unity3D網絡遊戲實踐》(第2版)要點摘錄 – 「同步理論」Reading Notes, Developing, Unity3D網絡遊戲實踐 / By LoneliNerd / 2022 年 10 月 1 日 2022 年 10 月 16 日 書名:《Unity3D網絡遊戲實踐》(第2版)作者:羅培羽所讀版本:機械工業出版社 同步理論狀態同步同步狀態信息客戶端定時向服務端報告位置,其他玩家收到轉發的消息後,直接將對方移動到指定位置這樣會導致看到對方瞬移,因此出現了「跟隨算法」和「預測算法」跟隨算法玩家1發送同步信息後,玩家2收到後,將對方以同樣速度移動至指定點 導致更大的誤差出現如玩家1從A點 -> B點 -> C點,在經過B點時發送同步信息玩家2還看到玩家1在A點,收到信息後,將玩家1的對象以同等速度移動至B點當玩家2看到的玩家1到達B點時,真實的玩家1可能已經到達C點預測算法預測對方在接下來某個時間點的位置,讓對方提早走到預測的位置上如玩家1從A點 -> B點 -> C點,在經過B點時發送同步信息玩家2根據移動公式計算出下一次收到同步信息時,玩家1應到達的點,並直接讓其同步移動至該預測點指令同步幀同步是一種常見的指令同步同步操作信息只傳輸玩家的操作指令玩家1按W時,發送前進的消息至服務端,服務端將其轉發至所有客戶端缺點誤差的累積不同電腦的執行速度有異,導致有人看到玩家1走了很遠,有人看到玩家1只走了一點點引入「同步幀」優化同步幀發送命令時附帶時間信息,客戶端根據指令的時間信息去修正移動的計算方式,讓不同電腦有盡可能一致的運行效果增加一個函數FrameUpdate,程序固定每隔0.1秒調用一次,每一次調用稱為1幀int frame = 0; //目前執行到第幾幀float interval = 0.1f; //兩幀之間的理想時間public void Update(){ while(Time.deltaTime < frame * interval) { FrameUpdate(); frame++; }}如果某幾幀執行時間太長,程序就會直接調用下一幀,盡量保證在第N秒的時候,執行到第10*N幀幀同步保證的是,各個客戶端在執行到同一個「同步幀」時,表現效果完全一樣當移動計算公式一樣,只要執行相同的幀數,移動距離必然相同指令的執行為了讓所有客戶端有一樣的表現,有兩種妥協方案延遲執行讓快的客戶端等慢的客戶端對快的客戶端不利樂觀幀同步丟棄速度慢的客戶端所發送的、過時的指令對慢的客戶端不利網絡延遲問題基本無解盡量發更少的數據,降低數據丟失和重傳的概率在客戶端上做一些障眼法