2012-04-01 16 views
2

Ich baue ein Online-Multiplayer-Billard-Spiel und ich habe Mühe, über den besten Ansatz zur Multiplayer-Physik-Simulation zu denken. Ich habe über drei mögliche Szenarien nachgedacht, von denen jedes seine eigenen Vor- und Nachteile hat und ich würde gerne eine Meinung von denjenigen hören, die entweder bereits etwas Ähnliches implementiert haben oder Erfahrung in Multiplayer-Online-Spielen haben.Multiplayer Billard Spiel Physik Simulation

1. Szenario: Physiksimulation auf den Clients: Der Spieler wiederum gibt den Schusswinkel und die Leistung an den Server weiter, und der Server aktualisiert alle Clients mit diesen Werten, damit sie den Schuss simulieren können unabhängig.

Vorteile:

  1. Low-Server überhitzen

Nachteile:

  1. Probleme mit der Synchronisation. Clients müssen die exakte Simulation unabhängig von ihrer Bildrate simulieren. (Möglich mit einem cleveren Algorithmus zu lösen, wie einer beschrieben here)
  2. Cheating. Spieler können schummeln, indem sie die Physik-Engine optimieren. (Mögliche zu bestimmen, wann ein Vergleich am Ende des Schusses mit anderen Spielern Kugelpositionen machen Wenn nur zwei Spieler am Tisch sind (dh nicht spectaculars) dann, wer der Betrüger ist.?)

2. Szenario:

Physik Simulation auf einem (dh "Master") Client (zB wer immer die Aufnahme macht) und dann jeden Physikschritt an alle anderen senden.

Vorteile:

  1. Keine Probleme mit der Synchronisation.

Nachteile:

1.Server hitzen. Jedes Mal wird der "Master" -Client die Koordinaten aller Bälle an den Server senden, und der Server muss sie an alle anderen im Raum senden. 2. Betrug durch den "Master" -Spieler ist noch möglich.

3. Szenario: Die Physik wird auf dem Server simuliert.

Vorteil:

  1. Keine Möglichkeit zu betrügen als die Simulation unabhängig von Kunden ausgeführt wird.
  2. keine Synchronisationsprobleme, bedeutet eine Simulation jeder wird das gleiche Ergebnis (Ereignis, wenn nicht zur gleichen Zeit, da der Netzwerkverzögerung)

Nachteile sehen:

  1. Huge Server-Überlastung. Nicht nur der Server muss die Physik 30/60 Mal pro Sekunde für jeden Tisch berechnen (es können 100 Tische gleichzeitig sein), sondern muss auch alle Koordinaten an alle in den Räumen senden.

EDIT Einige ähnliche Spiele zu der, die ich mache, falls jemand kennt, wie sie diese Probleme überwunden haben:

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

Eine andere Methode, die in den Sinn kommt, ist die Geschwindigkeit/Vektor zu übertragen und nur bei einer Kollision mit einer Schiene, einem anderen Ball usw. erneut zu übertragen ... Auch mehrere Online-Spiele, die ich ausgesetzt worden bin, kommen zu einer endgültigen Einigung positioniert und verdreht alles an den richtigen Ort, sobald die Bewegung gestoppt wurde. – JimR

+0

Danke für den Tipp. Wie ich sehen kann, kann dieser Ansatz in Szenario 1 integriert werden, um sicherzustellen, dass zwei Simulationen synchron sind und Betrug verhindern. – Alex

Antwort

0

Ich denke, dass die dritte ist die Beste.

Aber Sie können es sogar noch besser machen, wenn Sie alle Kollisionen und Bewegungen im Server berechnen, bevor Sie sie an die Clients senden (jede Kollision und Bewegung usw.), dann müssen Clients sie nur "ausführen".

Wenn Sie das tun, senden Sie die Informationen nur einmal pro Schuss, das wird das Netzwerkproblem erheblich reduzieren.

Und wie JimR schrieb, sollten Sie Geschwindigkeit oder Bewegungsgleichung anstelle kleinen Schritt zu tun, von kleinem Schritt inkrementeller Simulation (wie die Runge-Kutta-Methode)

Die Informationen, die der Server an den Client senden aussehen würde, dies:

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 

auch Sie sind wahrscheinlich eine Reihe von Klassen, die die differents physikalischen Gleichungen und müssen einen Weg brauchen, um sie serialisiert sie an die Clients (Java oder C# Objekte serialisiert leicht kann) zu senden.

+0

Das ist eine großartige Lösung, die die meisten meiner Probleme beheben würde. Das Einzige, worüber ich besorgt bin, ist, dass, um die Details des Schusses zuerst an den Server zu senden (dh Winkel des Schusses und der Macht) und einen Server haben, um den Schuss zu berechnen und dann zurück zu den Kunden zu schicken Nehmen Sie sich etwas Zeit, die die Erfahrung des Spiels brechen könnte (abhängig davon, wie schnell der Server ist). Ich baue ein Spiel ähnlich wie [dieses] (http://apps.facebook.com/flash-pool/?ref=ts), ich frage mich, wie sie es gemacht haben ... – Alex

+0

Was Sie können Um die Erfahrung zu vermeiden, senden Sie den Kunden die erste Bewegung, sobald Sie sie berechnet haben, und senden Sie dann die restlichen Bewegungen, wenn Sie die vollständige Berechnung durchgeführt haben (oder senden Sie sie, wenn Sie sie berechnen). Alternativ kann der Spieler, der die Aufnahme macht, seine eigene Physik berechnen und ausführen. Und wenn es fertig ist, kann es die Daten des Servers nehmen, um sicherzustellen, dass die Bälle an der richtigen Stelle sind. Und wenn nicht (vielleicht aufgrund von Gleitkommafehlern), positionieren Sie die Bälle einfach so, wie sie im Server sind. So sollte der Shooting-Spieler immer noch gut aussehen und sich wohl fühlen. – Mesop

+0

Tolle Tipps, danke! Ich warte nur darauf, ob noch jemand etwas hinzufügen wird, bevor ich anfange an dem Design zu arbeiten ... – Alex

Verwandte Themen