利用慣性和加速度進行網(wǎng)游位置同步
帶寬限制下的視覺實體屬性傳播
(Propagation of Visual Entity Properties Under Bandwidth Constraints)
(http://blog.csdn.net/lfhfut/archive/2008/03/02/2138512.aspx)
一文中使用滯后補償時間(LCT, Lag Compensation Time)來平滑客戶端的顯示.
在此方法下, 客戶端主角顯示在未來位置, 超前于服務(wù)器時間,
而同伴顯示過去的位置, 滯后于服務(wù)器時間.
所以兩個人一齊跑時, 總是會發(fā)現(xiàn)同伴落后于自己.
為了減弱同伴落后問題, LCT應(yīng)該用于遠方物體的位置同步, 越遠LCT可以越大.
就像我們觀察星星, 我們看到是其實是幾萬年前星星的樣子, 因為星星距離我們有幾萬光年.
對于周圍近距離的物體, LCT應(yīng)該盡量小, 接近0.
所以上文并沒有解決客戶端的平滑問題.
文中所述的導(dǎo)航預(yù)測算法(DR, Dead Reckoning)并不應(yīng)該放棄.
導(dǎo)航預(yù)測算法的原理是推算出未來的位置,LCT是將過去的位置作為現(xiàn)在位置來處理.
對于鄰近物體, 應(yīng)該顯示未來的位置.
因為出于操作感的考慮, 主角的位置是超前于服務(wù)器的, 不可能等服務(wù)器確認后再移動.
所以周圍同伴的位置也應(yīng)該是超前的, 這樣才不會有同伴總是落后于自己的現(xiàn)象.
導(dǎo)航預(yù)測算法不適用的主要原因是, 網(wǎng)游人物的移動是高度隨機的, 狀態(tài)更新太頻繁.
這其實不是問題, 因為有預(yù)測肯定比沒有預(yù)測要好.
在預(yù)測范圍內(nèi), 就不必發(fā)位置更新.
最差情況下, 每個預(yù)測結(jié)果都是錯誤的, 必須修正為實際的位置,
這就退化成為沒有預(yù)測的簡單的位置更新方法.
但是如果網(wǎng)絡(luò)延時50ms, 這50ms的預(yù)測是必須的.
因為客戶端表現(xiàn)的是超前服務(wù)器50ms前的景象.
這就存在同伴掉下懸崖的現(xiàn)象, 因為同伴在懸崖邊上的停止的消息要在50ms后才到.
這種問題在預(yù)測法中是無法解決的, 除非添加行為預(yù)測.
但是可以添加一個加速度來減少這種預(yù)測錯誤.
導(dǎo)航預(yù)測算法適用于飛機飛行模擬這類具有很大慣性的移動.
網(wǎng)游中的移動問題根源就是慣性不足, 有了慣性, 角色將無法任意更改移動狀態(tài),
從而大大減少預(yù)測錯誤.
人物在懸崖邊上停止的動作必須有個減速的過程, 只要在50ms之前減速,
就會正確計算出停止點, 避免了墜崖. 開始移動時也是有個加速過程.
并且, 客戶端主角的慣性可以大于服務(wù)器端, 而周圍物體的慣性可以小于服務(wù)器端.
產(chǎn)生的效果是, 主角的動作變遲鈍, 減少超前時間.
而周圍物體稍稍靈活, 增加了超前時間.
或許我們所處的世界也是虛擬的, 創(chuàng)世者為了位置同步而給我們這個世界加上了慣性和加速度的規(guī)則.
(轉(zhuǎn)載請注明來源于金慶的專欄)
帶寬限制下的視覺實體屬性傳播
(Propagation of Visual Entity Properties Under Bandwidth Constraints)
(http://blog.csdn.net/lfhfut/archive/2008/03/02/2138512.aspx)
一文中使用滯后補償時間(LCT, Lag Compensation Time)來平滑客戶端的顯示.
在此方法下, 客戶端主角顯示在未來位置, 超前于服務(wù)器時間,
而同伴顯示過去的位置, 滯后于服務(wù)器時間.
所以兩個人一齊跑時, 總是會發(fā)現(xiàn)同伴落后于自己.
為了減弱同伴落后問題, LCT應(yīng)該用于遠方物體的位置同步, 越遠LCT可以越大.
就像我們觀察星星, 我們看到是其實是幾萬年前星星的樣子, 因為星星距離我們有幾萬光年.
對于周圍近距離的物體, LCT應(yīng)該盡量小, 接近0.
所以上文并沒有解決客戶端的平滑問題.
文中所述的導(dǎo)航預(yù)測算法(DR, Dead Reckoning)并不應(yīng)該放棄.
導(dǎo)航預(yù)測算法的原理是推算出未來的位置,LCT是將過去的位置作為現(xiàn)在位置來處理.
對于鄰近物體, 應(yīng)該顯示未來的位置.
因為出于操作感的考慮, 主角的位置是超前于服務(wù)器的, 不可能等服務(wù)器確認后再移動.
所以周圍同伴的位置也應(yīng)該是超前的, 這樣才不會有同伴總是落后于自己的現(xiàn)象.
導(dǎo)航預(yù)測算法不適用的主要原因是, 網(wǎng)游人物的移動是高度隨機的, 狀態(tài)更新太頻繁.
這其實不是問題, 因為有預(yù)測肯定比沒有預(yù)測要好.
在預(yù)測范圍內(nèi), 就不必發(fā)位置更新.
最差情況下, 每個預(yù)測結(jié)果都是錯誤的, 必須修正為實際的位置,
這就退化成為沒有預(yù)測的簡單的位置更新方法.
但是如果網(wǎng)絡(luò)延時50ms, 這50ms的預(yù)測是必須的.
因為客戶端表現(xiàn)的是超前服務(wù)器50ms前的景象.
這就存在同伴掉下懸崖的現(xiàn)象, 因為同伴在懸崖邊上的停止的消息要在50ms后才到.
這種問題在預(yù)測法中是無法解決的, 除非添加行為預(yù)測.
但是可以添加一個加速度來減少這種預(yù)測錯誤.
導(dǎo)航預(yù)測算法適用于飛機飛行模擬這類具有很大慣性的移動.
網(wǎng)游中的移動問題根源就是慣性不足, 有了慣性, 角色將無法任意更改移動狀態(tài),
從而大大減少預(yù)測錯誤.
人物在懸崖邊上停止的動作必須有個減速的過程, 只要在50ms之前減速,
就會正確計算出停止點, 避免了墜崖. 開始移動時也是有個加速過程.
并且, 客戶端主角的慣性可以大于服務(wù)器端, 而周圍物體的慣性可以小于服務(wù)器端.
產(chǎn)生的效果是, 主角的動作變遲鈍, 減少超前時間.
而周圍物體稍稍靈活, 增加了超前時間.
或許我們所處的世界也是虛擬的, 創(chuàng)世者為了位置同步而給我們這個世界加上了慣性和加速度的規(guī)則.
(轉(zhuǎn)載請注明來源于金慶的專欄)