Jkeeper 發佈的文章

之前使用了 Unity FixedUpdate 計時器來處理 update, 後來發現在多端之間客戶端計算結果不一致
開始查起這個問題, 查到最後發現是因為客戶端調用 update 次數不一致造成的
由於A端跟B端在FPS上有所差別, A端FPS=60, B端FPS=90, 在這個基礎上調用的 fixedUpdate 次數不一致
造成了B端的怪物行走比A端快

修改思維
(1) 如果不改變 fixedUpdate 造成的次數問題就必須把行走距離改成根據時間差來計算實際距離, 如下

movement = 120 pixels/sec
則 120/50 =2.4/Frame, 每幀需要行走2.4pixels, 
如果當前幀跟上一幀時間間距為32 minisec,
 則 32 / 20 = 1.6 * 2.4 = 3.84 pixels 為當下幀需要行走的距離

(2) 修改計時器保證每一次 update 都是 20 ms

//將 fixedUpdate 更新頻率拉高到 120 FPS
void FixedUpdate(){
    long nowt = this.GetUtcTimeMS();
    finish = false;
    while (!finish){
    if ((nowt - this.updateTs) > 20){
        this.updateTs += 20;
        //實際調用刷新函式
        this.doUpdateLogic(param);
        finish = false;
    }
}
假設客戶端在一個tick內調用3次doUpdateLogic, 底下調用不可以使用 UTC.Now 去計算時間差值, 不然3次計算
出來的差值都會是最大值

怪物追擊思考了幾個作法

一、以房主客戶端為主計算 Boss AI 的行為, 發送給服務端進行廣播, 其他客戶端收到消息後根據消息內容進行撥放
裡面涉及到幾個問題
(1) 需要服務端綁定房間主, 如果房間主離線則其他人需要頂替發送 AI 操作行為, 銜接上不少細節問題
(2) 其他端收到消息需要根據消息的 frameId 進行回放或是快進

二、各端自行計算並達成一致
(1) 開房時服務端把必要參數發送給客戶端確保客戶端計算結果一致
(2) 客戶端AI刷新要改成時間累計方式, 不然會有錯

NOTE
一、斷線重連處理