2012-04-01 169 views
2

我正在建立在線多人檯球遊戲,我正在努力想出多人物理模擬的最佳方法。我想到了三種可能的場景,每種場景都有各自的優點和缺點,我想聽聽那些已經實現了類似的東西,或者在多人在線遊戲方面有經驗的人的一些看法。多人檯球遊戲物理模擬

1號方案:在客戶端上物理模擬:在打開播放器採取了一槍發射擊和服務器電源的角度,以及服務器更新所有的客戶提供這些價值,使他們能夠模擬射擊獨立。

優點:

  1. 低服務器過熱

缺點:與同步

  1. 問題。無論客戶的幀頻如何,客戶都必須模擬精確的模擬。 (可能用一個像描述的一些巧妙的算法來解決here
  2. 作弊。玩家可以通過調整物理引擎來作弊。 (可以確定使得在拍攝與其他球員的球位置結束的比較時,如果只有兩名球員都在表(即不spectaculars)的騙子是那麼誰?)

第二個場景:

對一個(即「主」)客戶端(例如,誰拍攝過的人)進行物理模擬,然後將每個物理步驟廣播給其他人。

優點:

  1. 沒有問題同步。

缺點:

1.Server過熱。每個時間步驟,「主」客戶端將把所有球的座標發送到服務器,服務器將不得不將它們廣播給房間中的其他人。 2.「主人」玩家的作弊仍然有可能。

3rd場景:物理將在服務器上模擬。

優勢:

  1. 沒有可能作爲模擬運行獨立客戶端的欺騙。
  2. 不同步的問題,一個模擬意味着每個人都將看到同樣的結果(事件如果不是因爲在網絡滯後的同時)

缺點:

  1. 巨大的服務器超載。不僅服務器必須每秒鐘爲每個桌子計算30/60次物理(可能同時有100個桌子),而且還必須將所有座標廣播到房間中的每個人。

編輯 一些類似的遊戲一個我做,萬一有人熟悉他們是如何克服這些問題:

http://apps.facebook.com/flash-pool/ 
http://www.thesnookerclub.com/download.php 
http://gamezer.com/billiards/ 
+0

想到的另一種方法是傳輸速度/矢量,並且僅在與鐵軌,另一個球等發生碰撞時重新傳輸......另外,我已經接觸到的幾個在線遊戲在最終達成一致一旦運動停止,將所有的東西都放到正確的位置。 – JimR 2012-04-01 17:58:27

+0

感謝您的提示。從我所看到的情況來看,這種方法可以集成到方案1中,以確保兩種模擬是同步的並防止作弊。 – Alex 2012-04-01 18:32:14

回答

0

我認爲,第三一個是最好。

但是,如果您在將服務器發送給客戶端(每次碰撞和移動等)之前計算服務器中的所有衝突和移動,那麼您可以做得更好,那麼客戶端必須「執行」它們。

如果你這樣做,你將只發送一次信息一次,這將大大減少網絡問題。

而作爲JimR寫,你應該使用速度或運動方程,而不是做小步小步漸進模擬(如龍格 - 庫塔法)

服務器發送到客戶端會是什麼樣的信息這樣的:

Blackball hit->move from x1,y1 to x2,y2 until time t1 
Collision between blackball and ball 6 at time t1 
Ball 6 -> move from x3,y3 to x4,y4 until time t3 
Blackball -> move from x5,y5 to x6,y6 until time t4 
Collision between Ball 6 and Ball 4 at time t3 
and so on until nothings move anymore 

而且,你很可能需要一堆的代表型動物物理方程類和有辦法序列化它們,將它們發送到客戶端(Java或C#可以很容易地將對象序列化)。

+0

這是一個很好的解決方案,它可以解決我的大部分問題。我唯一擔心的是,爲了將鏡頭的細節首先發送到服務器(即鏡頭和電源的角度),並且有服務器來計算鏡頭,然後將其發送回客戶端需要一些時間,這可能會破壞遊戲的體驗(取決於服務器的速度)。我正在構建一個類似於[這個]的遊戲(http://apps.facebook.com/flash-pool/?ref=ts),我想知道他們是如何做到的... – Alex 2012-04-01 18:35:30

+0

你能爲避免打破這種經歷,您需要在計算完成後立即向客戶端發送第一個動作,然後在完成完整計算後發送其餘動作(或在計算它們時發送它們)。 或者,執行拍攝的玩家可以計算並執行自己的物理。當它完成後,可以通過服務器的數據來確保球位於正確的位置。如果不是(由於浮點錯誤,也許)只是重新定位球在服務器中的位置。 這樣的射擊球員應該仍然有良好的外觀和感覺。 – Mesop 2012-04-01 18:46:05

+0

偉大的提示,謝謝!在我開始設計設計之前,只要等待看看其他人是否會添加一些東西...... – Alex 2012-04-01 19:12:22