需要知道的是,不同的球員在不同的位置,延遲也是不同的。自然,因為網絡抖動,即使玩家A和玩家B同時按下同一個操作,也可能因為網絡延遲導緻不同的結果。比如,A和B同時向服務器發送數據,A需要10 ms,B需要20ms,因此,A在服務器中領先于B。
所以,如果服務器收到一個數據包,立即發送給其他所有客戶端,比如發送給C的數據包需要90ms,而B發送給C的數據包隻需要50ms,就有
表示“不”
服務器端-
因為C的網絡延時或抖動,用了10 90=100ms,C實際接收A操作幀變成了100ms。
B -
服務器端-
因為C的網絡延時或者抖動,用了20 50=70ms,C實際接收B操作幀變成了70ms。
然後,服務器收到的信息是操作A先于操作B,但是到了玩家C,就變成了操作B先于操作A。
這就會導緻一個非常緻命的情況,就是比賽結果都不一樣。這個遊戲怎麼玩?而且如果每個玩家都有一個操作,會讓服務器廣播一次數據包,對網絡帶寬也是一個巨大的挑戰。此外,由于網絡環境問題,B操作的網絡數據包可能會被網絡丢失。所以,一個被廣泛使用的方法是,一個遊戲客戶端可能以更低的延遲發送同一個數據包,比如一個操作向服務器發送三個數據包,隻要其中一個數據包能被服務器接收到,就不會對遊戲産生太大影響。
所以遊戲的同步機制其實是這樣的,服務器會實際框定遊戲操作。我們假設這個幀的粒度是100ms。
,