2011-09-16 47 views
10

我正在考慮實施一個涉及快速運行對象的HTML5 mmog的。玩家通過射擊不斷改變物體的方向。我想到WebSockets等(socket.io)和帆布WebSockets性能

我認爲方向改變的計算必須在客戶端和服務器端完成,然後進行同步 - 服務器是主服務器以避免作弊。

我的擔心是,無論服務器速度有多快,延遲都會導致延遲,從而導致同步失敗。

有沒有解決這個難題的好方法?如何實現這一數據量的實時同步,其中所有信息對於不錯過方向改變至關重要。所有玩家都需要立即獲得移動物體的新方向,以免破壞遊戲玩法。

我認爲這個問題已經在現有的mmogs中解決了。

任何想法?

+1

您可以發送每個操作的時間戳,然後讓服務器在適當的時間追溯插入操作。 (這並不能完全解決你的問題,因爲玩家可以通過改變時間戳來作弊,並且玩家在晚些時候仍然不會看到改變,但是它會減少來自滯後的問題,並且你將無法傳輸數據即時不管你做什麼。) – someone

+1

基於客戶端的時間戳永遠不會準確。我寫這篇文章的時間是2分鐘。 – Marc

+0

主要問題在於是否有一種方法可以實時同步大量數據,這些數據是通過大量連接同小信息(玩家拍攝/方向變化)聚合而成的。 – Marc

回答

7

在這種情況下你可以做的最好的事情是嘗試和預測移動客戶端(航位推算),然後在必要時用服務器的數據修正位置/速度。

例如,假設您的快速移動物體以5秒的速度從屏幕左右移動,並且玩家在此處進行拍攝並且它會改變方向,因此它現在以5倍的速度在屏幕上向上移動(90度轉彎)。

客戶端應用程序可能會比從服務器獲取數據(例如每秒鐘60次更新客戶端以及每秒從服務器接收10次數據包)更新更頻繁。比方說,在服務器更新到來之前,對象實時改變了剩餘5幀的方向。在客戶端,對象將繼續沿着它當前的軌跡移動,直到它從服務器接收到它改變方向的更新(即,當它不從服務器接收數據時它不停止),在此時,客戶端會糾正對象的位置和速度。

您如何進行修正將決定動畫看起來如何跳動。你可以立刻將它移動到正確的位置,從而引起一些跳躍,但是立即給出正確的位置,或者你可以改變它的速度,使它平穩過渡到那個位置,不會跳躍,但有在調整的平均時間內一個稍微不準確的位置。

您總是會遇到一些情況,這些更正最終會變得非常大(例如,某人的連接非常糟糕,丟包,天空延遲等)。這就是當你在網絡遊戲中遇到人們通常稱之爲滯後的瘋狂異常的時候,比如當一個對象跳過很遠的距離或者移動到「趕上」它應該在的位置時。沒有辦法100%同步。你所能做的就是對事情應該做的事情做出非常好的猜測。

下面是一些更詳細的文章,祝你好運!

http://gmc.yoyogames.com/index.php?showtopic=415538 http://www.gamasutra.com/view/feature/3230/dead_reckoning_latency_hiding_for_.php

+1

有一個來自Adobe MAX 2010的這種技術的很棒的入門視頻 - http://tv.adobe.com/watch/max-2010-develop/building-p2p-multiplayer-games/ – c69

2

服務器是所有的活動同步正確的地方。您不希望每個玩家將其輸入數據發送給其他「n」玩家,因爲它會創建太多的通信路徑。

服務器將獲取玩家數據並確定移動物體的新軌跡,然後向每個玩家發送更新。這可以用虛擬遊戲時間的固定單位來完成,我將其稱爲「蜱」。

從服務器的角度來看這給你就像一個循環如下:

  1. 從玩家接收輸入
  2. 更新遊戲狀態
  3. 分發遊戲狀態更改爲玩家

你需要處理一些情況,比如在一段時間內沒有收到玩家的輸入(例如,可能忽略該玩家對該幀)。

在客戶端,當您在等待下一次遊戲中的服務器更新時,您可以繼續沿着之前的軌跡移動對象,隨着時間的流逝渲染幀。

當從服務器收到當前遊戲刻度更新時,必須應用新的遊戲狀態。

如果對象的新實際位置非常接近您外推的位置,您可以設置新位置並將其渲染到下一幀。

如果新位置距離外推位置「很遠」,那麼您需要決定是立即將物體扭曲到目的地還是做某種加速或線性運動以在短時間內移動它。