如何處理幀同步刷新頻率

之前使用了 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次計算
出來的差值都會是最大值

发表评论

电子邮件地址不会被公开。 必填项已用*标注