當前位置: 華文問答 > 遊戲

Faker 在采訪中說到遊戲延遲 5ms 便能感受到差異,這個程度誇張嗎?

2022-05-12遊戲

不下結論,畢竟人和人的體質不同,對於某些情況,你永遠不知道是不是真有人突破了人類的生理極限

作為遊戲引擎碼農給諸位科普一下遊戲同步機制

實際上目前很多的RTS類遊戲使用一種叫訊框同步(可能結合狀態同步)的方式來給所有玩家同步遊戲

可以用一個簡單的示意圖來描述

  1. 首先,玩家P1進行了一個操作,比如按下了滑鼠左鍵
  2. 那麽P1會將他按下了滑鼠左鍵的資訊告訴伺服器
  3. 伺服器收到P1的訊息後,會將玩家P1按下了滑鼠左鍵的訊息同步給P1,P2,P3,P4,P5,這樣,所有玩家電腦上都會出現玩家P1按下了滑鼠左鍵的操作,實作遊戲的同步.

但這種同步方式,遠沒有上面解釋的那麽簡單,需要知道的是,不同的玩家所在的位置不同,延遲也不同,自然因為網路抖動的原因,即使玩家A和玩家B同時按下了同樣的一個操作,因為網路延遲原因可能會導致不同的結果,舉個例子,A和B同時發送數據到伺服端,A花了10ms,B花了20ms,於是,伺服端中A先於B

因此如果伺服端收到一個封包後,就立即下發給其它所有客戶端的話,比如發給C,A的封包發給C花了90ms,而B的封包發給C只花了50ms,就有

A--->伺服端--->C 因為網路延遲或抖動,花了10+90=100ms,C實際收到A操作幀就變成了100ms

B--->伺服端--->C 因為網路延遲或抖動,花了20+50=70ms,C實際收到B操作幀就變成了70ms

那麽,伺服端收到的資訊是A操作先於B,但到玩家C哪裏,就變成了B的操作先於A了

這將導致一個非常致命的情況,就是遊戲的結果都不一樣了,這遊戲還怎麽玩?並且如果每個玩家一有操作就讓伺服端廣播一次封包,對網路頻寬也是一個巨大的挑戰.除此之外,因為網路環境問題,B的操作網路封包可能會被網路丟掉,因此,一個用的很多的做法是,一個遊戲客戶端可能會用更低的延遲來發送同樣的封包,比如一個操作發送3個封包到伺服端,只要當中的一個封包能夠被伺服端收到,就不會對遊戲造成太大的影響,你不可能因為為了魯棒冗余的設計,讓網路頻寬花銷也成倍增長.

因此,遊戲的同步機制實際是這樣的,伺服端實際上會對遊戲操作也進行分幀,我們假設這個幀的粒度是100ms

首先,A和B發生了某個操作,並將這個操作發送給伺服端.這個時候,伺服器並不會立即把A和B的操作立即下發,而是會把A和B的操作記錄下來,直到第100ms的時候,才將操作下發給A和B

也就是說,在這100ms內,A和B的操作在現實世界中,誰先誰後其實已經不重要了,真正決定先後的,可能和伺服端演算法有關,比如B在第50ms對A造成了9999點傷害,A在第60ms對B造成9999點傷害,但因為伺服器在100ms的同步幀中先處理A的數據,導致盡管是現實世界中B先出手,但仍然判定為A先對B造成傷害,當然更多的是A和B同時對對方造成傷害,導致一個"同歸於盡"的結果,這樣的做法有很多好處,第一個是能很大程度上避免網路抖動問題,讓遊戲更加平滑,第二能夠減少頻寬的負擔,也能夠讓各玩家收到的操作資訊保持一致,最終讓遊戲世界的同步保持一致

大多情況下,遊戲同步時間大約在60-100ms左右,比賽服的同步時間可能會更低達到30-60ms左右,那是不是說十幾毫秒的延遲全是心理作用沒有影響呢?

其實也不全是,觀察下面這種特殊情況,A和B同時進行了一個操作,但A比B延遲少了5ms

這將導致一種情況,A在伺服器看來,A操作發生在第200ms,而B因為延遲只能算到後面的操作幀也就是300ms,即使實際的網路延遲是5ms,但它實際造成了100ms的遊戲延遲,但總的來說,發生最終情況更多時候是一個機率問題,在實際遊戲情況中,因為遊戲封包冗余發送機制,最終情況可能發生,但不會太多.與其說是網路延遲的鍋,不如說是網路抖動影響的可能性會更大

因此註意了:遊戲中顯示的延遲時間,僅僅是延遲測試的時間,並不是遊戲實際訊框同步的時間,只有部份參考意義,真正的延遲與否還得看實際同步幀間隔時間,如果日常情況下,你說20ms和30ms那差距的10ms延遲影響你操作了,更大的可能性是總得給自己找個gg的理由,而右上角的延遲剛好替你背了鍋.