簡體   English   中英

客戶端 - 服務器通信,websockets延遲

[英]Client-server communication, websockets latency

簡短的問題:

當客戶端向服務器發送數據包突然改變很多時,延遲是否可以?

長問題(我遇到的問題):

我正在使用websockets進行html游戲,目前正在進行客戶端輸入預測,我使用相同的代碼進行客戶端和服務器檢查沖突,計算新的玩家位置,30次/秒。 這是我在服務器端和客戶端更新玩家移動的方式:

if(controls.pressingRight === true)
{
    if(controls.dx < settings.MAX_X_SPEED)
    {
        controls.dx += settings.DELTA_X_SPEED;
    }
    else
    {
        controls.dx = settings.MAX_X_SPEED;
    }
}
if(*noCollisions*)
{
    game.me.x += controls.dx;
}

這樣玩家的動作就很順暢了。 當用戶按下並按住“D”鍵盤按鈕conrols.pressingRight值變為true時,直到玩家釋放“D”按鈕為止。 我編寫代碼的原因是因為我不確定問題是在我的代碼中還是與延遲的變化有關。 例如,我單擊D按鈕並快速釋放它,我的客戶端畫布上的播放器移動像~7像素但是在我的服務器端播放器移動到20像素或更多到一側(盡管有時客戶端和服務器端移動相同數量的像素) 。 我猜這個問題是因為當我按下按鈕移動播放器時,延遲可能會很低,讓我們說20,但是當我發布時,ping可能就像是200,這意味着數據包的發送時間晚於應該的並且因為該服務器仍然將我的“pressRight”值視為真。 我錯過了什么嗎?

當客戶端向服務器發送數據包突然改變很多時,延遲是否可以?

是的,一點沒錯。 連接性變化始終發生。 在天線移動很多的移動設備中尤其如此,導致連接暫時丟失。

我正在使用websockets進行html游戲,目前正在進行客戶端輸入預測,我使用相同的代碼進行客戶端和服務器檢查沖突,計算新的玩家位置,30次/秒。

...

當用戶按下並按住“D”鍵盤按鈕conrols.pressingRight值變為true時,直到玩家釋放“D”按鈕為止。

這絕對是一種方式,但如果你走這條路,服務器應該是你的事情的真相來源。 客戶端可以移動到它認為移動的位置,然后服務器可以更新位置,將客戶端反彈回標准服務器已知的事件版本。 在最佳情況下,客戶不會移動太多。 但是,滯后發生,有時客戶端會重新回到更遠的位置。

當游戲需要這種交互性時,沒有完美的解決方案。 但是,有很多方法可以解決它。 另見: http//gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM