這是一個老問題,但我最近研究出類似的代碼,所以也許這會幫助某人。
是延遲在計算中總是有用的。但它比RTT稍微複雜一些。往返時間總是在變化......您的網絡代碼可以保持平均值,但與平均值的差異很大。
本地客戶端,遠程客戶端和服務器都使用算法預測當前位置。下面的數據是接近典型:
- 時間:噸
- 放置:位置(X,Y,Z)和方向(X,Y,Z,W)
- 機芯:線性運動矢量給予與長度爲速度(X,Y,Z),並 旋轉運動向量賦予軸線與長度爲轉速(X,Y,Z)
方向您需要一個從[T,P推斷算法,M]設置爲simtime。我不會在這裏提供這些。
當客戶端在[T,P,M]的船舶驅動器中記錄更改時,在T + deltaT之前不會到達服務器。但是,如果deltaT在典型網絡延遲的容忍範圍內,服務器可以說「是的,它發生在T,我接受」。否則,它可能需要糾正客戶說「沒有那麼容忍,它發生在我的時間T'」,在這種情況下,客戶將不得不重新從服務器的糾正的一個更新所有隨後驅動的[T,P,M]變化(這意味着你需要保持一個隊列或列表)。
下一個客戶端將在T + deltaT + differentdeltaT獲取它。它不可能改變它已經模擬的東西,所以如果它不延遲它的模擬,它將跳過遠程船,你會看到一個混亂的框架。這就是爲什麼遠程驅動的船隻應該使其模擬延遲一段時間,持續時間大於2 *typicalδT。這應該是一個恆定的延遲,或者逐漸改變的延遲,嚴重滯後的時候,你會看到混蛋幀仍然
可以流暢的額外平滑代碼的所有抽搐,但不這樣做,直到你的代碼,否則完美無瑕,因爲它會讓人不可能看到問題出在哪裏。
你必須有一個很好的同步時間參考。很多代碼都比較滑落(例如RakNet沒有(或沒有)非常好)。這裏有一個很好的提示:短時間內,你可以假定每個人的時鐘都以相同的速率運行,你只需要計算出偏移量是多少,所以保持一個最大和最小偏移量的窗口,並在學習時關閉它;從長遠來看,您需要補償時鐘快速或慢速運行的客戶,因此,如果您確實知道必須打開窗口,請打開該窗口。您必須使用單調遞增的本地時間源,並且不要使用處理器速度(現在是可變的)。
不,當本地「頭像」移動時不要延遲本地模擬。這看起來太沒有反應了。你可以稍微延遲一段時間(最多50毫秒)以幫助改善同步,但是一直延遲到RTT會使你的遊戲看起來令人沮喪地失去響應。爲本地延遲設置一個選項並播放它,因爲一個小的一致延遲是可以接受的,並且可以改善同步。但這不是必要的,可能會導致很多問題,所以我建議最後一次執行該代碼。 (如果你正在嘗試做一個FPS近戰遊戲,你需要做這個,所有其他的幫助你可以得到)。
至於防止欺詐與模擬平滑:首先,客戶不應該從最後一個已知的位置推斷,當官員的位置發生變化時。它應該註冊一個調整矢量,然後慢慢地從舊路徑移動到新路徑以獲得平滑(但就像我上面所說的那樣,最後執行此代碼或者將屏蔽其他錯誤)。其次,服務器應該容忍大範圍的延遲......即使在同一個以太網上的機器上,數據包延遲通常會運行5ms到100ms左右......這是一個很大的範圍。當然,你需要把它關掉,並說「如果你說你在時間T移動,但我在T + some_large_number得到了數據包,那麼我認爲你正試圖調整過去並對我說謊。」 some_large_number不應該比平均RTT大得多,以保持誠實。
模擬不會嚴格同步。他們應該在互聯網上停留不超過400毫秒,但肯定會在滯後時間以外流失到30秒或更長時間,而且你需要容忍那些因爲它們並不稀有的東西。鑑於互聯網受銅纜中光速的限制,您可以始終期望單向延遲通常至少爲您的遠端客戶100ms,通常爲500ms或更長。
因此我強烈建議你不要試圖通過互聯網混戰的FPS遊戲(一些大公司嘗試,但總是有麻煩)。如果您使用投射物(通過在一次模擬中快速運行它們並在另一次模擬中運行速度較慢),您可以執行一些技巧,以便即使計時關閉,它也會顯示。另外,FPS遊戲使用命中檢測基於攻擊者模擬的規則......當攻擊者知道他已經死於目標並且未命中時,感覺更加錯誤,然後當防禦者知道他已經擋住並被擊中時無論如何。你必須選擇一個或另一個,並且從心理上來看,這是如何完成的。近戰需要一定程度的同步,這是坦率的不可能的,大多數遊戲公司不會觸及MMORPG FPS近戰,而是使用自動瞄準(嘗試玩Mortal Online,你會明白我的意思)。
祝你好運。
請注意,我不是問很多遊戲使用什麼樣的運動系統或算法,我已經討論過這是另一個線程。這裏的主要問題是延遲是否應該考慮到移動計算(客戶端或服務器端),以及我做出的假設是否正確。 Upvote試圖幫助不管。 – Tom 2009-09-19 20:45:07
這是一個*這在一個* – Tom 2009-09-19 20:45:39
抱歉的誤解。 我的兩分錢是,你至少應該在服務器端使用延遲補償,以使其對延遲時間較長的人員公平。 然而,實現它的好方法並不是我有資格回答的。 祝你好運,我希望你會找到你最終找到的。 – 2009-09-19 20:55:07