2017-08-01 81 views
2

我正在製作一個基於磁貼的2D RPG(自上而下,32x32像素)。玩家可以使用箭頭鍵移動到任何相鄰的圖塊。我發現它有點難於理解插值。客戶端/服務器插值

我明白遊戲中的方向可以突然改變,像航位推算這樣的概念將毫無用處。

客戶端預測正常工作,但是,當我從服務器收到有關其他客戶端位置的不同語言的更新時,我很難理解這個概念。

例如,我的球員A.

目前,當玩家B移動,我收到他們的新位置,並從服務器的時間戳。在局域網連接上,這似乎按預期工作,並且玩家B立即在屏幕上移動,並進行正確的插值。我計算從服務器發送數據到接收數據的時間,並且每幀插入差值(16ms,60fps)。如果我有200ms的RTT,而玩家B有400ms的RTT,並且他們每250ms移動1個瓦片,我會在300ms後收到數據,所以我只能看到玩家B傳送到新的瓦片。

我是否必須將其延遲時間添加到時間戳中,因此當我收到它時,時間戳匹配和動畫順利啓動?

我在想這個嗎?

謝謝。

編輯:我忘了提及服務器每隔50ms發送一次更新。

回答

0

如果你正在編寫的模擬,其中航位推算沒有價值,它會是最好有服務器捆綁的遊戲狀態,或者更好的比賽狀態增量,作爲一個單位(雖然不一定是單個數據包,如果你的狀態很大)。

從你的遊戲描述來看,我認爲你不會允許客戶獨立於服務器授權遊戲狀態更新 - 因此客戶往返時間並不重要。即使您自己的客戶端的延遲和滯後也是無關緊要的 - 服務器更新率是您想要插入的值。

在某些客戶端具有廣泛變化的延遲或重大丟失以及許多數據包比預期晚到達的情況下,您可以在該客戶端上本地加速服務器狀態重播,以「趕上」,但客戶端的輸入將會仍然必須應用於服務器上的當前遊戲狀態(客戶端看到延遲 - 在某些情況下會出現嚴重錯誤)。

你真的無法隱藏在像您所描述的一個,其中所呈現的遊戲狀態沒有錯誤是允許遊戲的等待時間 - 你只能「僞裝」服務器遊戲狀態是在更多的模擬改變通過在兩個後續數據點之間插入服務器遊戲狀態來實現。其他客戶端的延遲總是隱藏給每個人,但客戶端本身 - 即使服務器也不應該在意。

+0

謝謝MMc,我想我現在對此瞭解得更清楚了。該服務器具有發送玩家的位置在每個服務器更新,即使一直沒有其他輸入,所以我會永遠在客戶端的每個時步過去和當前位置?如果一個客戶端只在輸入處理完畢時才發送數據,那麼客戶端可能會在幾秒鐘內收不到任何服務器更新,無論如何,我可以適當插入嗎? – Max6701

+0

如果你想推斷,你可以使用你從前一對數據點計算出的增量,但是你需要使用外推位置作爲當前數據,當你的服務器最終發送一個新的數據點時再次開始插值。如果使用來自服務器的前一位數據,那麼顯示的數據將是不連續的,因此使用外推法並減少隨時間推移引發的任何錯誤通常是更好的解決方案。 – MMc