2011-11-30 63 views
12

我試圖找到最好的方法來做到這一點,考慮在移動(3G帶寬)上使用拋射和下降塊進行輪流翻轉的平板遊戲。如何在多人遊戲中同步物理?

我想知道是否有一個設備(當前玩家角色=服務器角色)可以運行物理並將一些「關鍵幀」數據(塊的位置,方向)發送到另一個設備,收到「關鍵幀」。 使用這種方法,我非常害怕大量的數據,以保證其他玩家的設備具有相同的視覺效果。

另一種方法應該是發送物理數據(力,加速度......)並在其他設備上運行物理,但我恐怕永遠不會有相同的結果。

+0

如果對象具有相同的起始位置和相同的phyisics數據,這兩個設備上的對象是否具有完全相同的結果? – Kjetil

+0

@Kjetil只有當你有一個固定的滴答時間。如果更新每個圖形框架上的物理結構,通常不會出現這種情況。 –

+0

Right Rob。我不確定,但是考慮到跨平臺(不同的體系結構)和浮點計算問題,不是嗎? –

回答

9

我當前的實現是這樣的:

  1. Server管理的物理模擬
  2. 上的任何對象的任何重大沖突,對象的絕對位置,旋轉和速度/加速度/力發送到每個客戶端。
  3. 客戶端將每個對象與其速度一起設置在位置並應用必要的力。
  4. 客戶端計算等待時間並提前物理系統以適應滯後時間。

這對我來說工作得很好。我有物理系統運行了幾十個子系統(地圖)。

約我實現的一些關鍵的東西:

完全忽略未標記爲「必要」的對象。例如,對玩家運動或草和水作出反應的塵土和灰塵顆粒響應玩家的移動。基本上非必要的東西。

所有這些都是通過UDP發送的。這對TCP來說是很可怕的。

6

你會想發送絕對位置和旋轉。

你說得對,如果你只是派遣部隊,它將無法工作。有可能完成這項工作,但比發送職位要困難得多。您需要兩個設備以相同的方式執行計算,因此在每幀之前,您需要等待來自其他設備的輸入,您需要使用相同的時間步,腳本需要以相同的順序運行或可交換,並且您只能使用CPU指令保證在兩臺機器上獲得相同的結果。

最後一個問題使得它特別成問題,因爲這意味着你不能使用浮點數(浮點數/單數或雙精度)。你必須使用整數,或者滾動你自己的數字格式,所以你不能利用許多現有的工具。

許多遊戲在客戶端預測中使用客戶端 - 服務器模型。如果你的遊戲是基於回合的,那麼你可能會逃避不使用客戶端預測。相反,您可能會讓客戶端滯後一段時間,這樣您可以確信服務器的輸入在您進行渲染時已經存在。客戶端預測只有在客戶端可以進行服務器關心的變更(例如移動)時纔是重要的。

+0

通過等待每個幀的輸入,我認爲你的意思是每個物理幀? – RobotRock

+0

我的意思是每個輸入框架,它可能與物理框架是1對1,或者不是。將輸入幀和物理幀設置爲1比1是最容易的,但如果您願意,每次採樣輸入時都可以更新物理。 – notallama