# gleiche Geschwindigkeit



## Guest (19. Mai 2007)

Hallo,
ich entwickle ein kleines Multiplayer RPG. Nun steh ich vor dem Problem, dass das Spiel auf jedem PC unterschiedlich schnell läuft. PC A hat 1000mhz mehr also wird die gameschleife logischerweise häufiger durchlaufen als auf PC B der langsamer ist.
Desweiteren läuft auf einem anderen Pc ja auch ein "Server", kollisionskontrolle usw.

Wie kann ich das nun in Griff bekommen, sodass alles Syncronisiert auf eine einheitliche Geschwindigkeit gebracht wird?

Ich steh momentan etwas auf dem Schlauch. Würde es schon genügen, sämtliche Bewegungswünsche an den Server zu übermitteln und Veränderungen der Positionen auf dem Server "berechnen" zu lassen der die neuen Positionen dann an die Client mitteilt?

grüße


----------



## Sanix (19. Mai 2007)

Ganz einfach, du legst dich auf eine bestimmte Schleifendurchlaufzeit fest.

Dann schaust du, wie viel Zeit bis jetzt verbraucht wurde und die restliche Zeit lässt du durchlaufen


```
while Zeit noch nicht durchgelaufen
{
 tuheNichts();
}
```


----------



## Gast (19. Mai 2007)

Danke. Gute Idee. Was für Zeitmessung ist dafür genau genug? System.nanoTime()?

Ist die Variante über den Server zu langsam? Also zuviel Daten? (Da es mehr ein Versuch wird, wird wegen der Einfachheit wohl RMI genutzt). Hätte wohl den Vorteil, dass jeder Client soschnell er eben kann sein Bild immer schön aufbaut, die Bewegung usw passiert auf dem Server. Gleichschnell für alle.


----------



## Sanix (19. Mai 2007)

Für die while Schlaufe nimmst du besser Milisekunden. Dann hast du keine Probleme.
Das mit dem Server kannst du auch machen, dann musst du halt einfach noch eine Logik auf dem Server schreiben.


----------



## Gast (26. Mai 2007)

Hallo,
Danke nochmal. Soweit funktioniert auch das meiste. 
Problem ist nur, wenn ein Client die Anwendung einfach beendet,  dauert das ja bis ein timeout eintritt. Was kann man da am "einfachsten" machen? Auf dem Server jeden Client in einem Thread halten? bzw beim Versenden für jeden Client nen Thread erzeugen?
Oder umgekehrt der Client sendet per Timer im sekndentakt ein "alive" wenn das ausbleibt wird er entfernt?

Was gibt es da noch für möglichkeiten?


----------



## Gast (30. Mai 2007)

der client sollte grundsätzlich "unabhängig" vom server agieren. d.h. der benutzer kann erstmal jegliche aktion "befehlen" und der client führt sie auch aus. diese aktionen werden an den server geschickt, der kontrolliert, ob die durchgeführte aktion mit den regeln vereinbar ist (sollte normalerweise auch der fall sein, es sei denn, der benutzer manipuliert seinen client), speichert das resultat (z.b. ein gefundenes item) und sendet das ergebnis an den client zurück.

der client speichert alle aktionen in einem queue (fifo). sollte eine aktion aus dieser queue bestätigt werden, so wird sie entfernt. wird eine aktion nicht bestätigt, findet ein rollback aller nachfolgenden aktionen statt. sprich, sie haben technisch nicht stattgefunden.

da sehr wahrscheinlich udp verwendet wird, können die bestätigungen in beliebiger reihenfolge eintreffen. dies muss beachtet werden, d.h. bestätigungen für spätere events als das aktuelle müssen hinten angestellt werden.

und das ist der timeout.

der client klassifiziert die verbindung zum server als unterbunden, falls die aktuelle aktion (platz 1 in der queue) länger als X zeiteinheiten nicht bearbeitet wurde.

der server klassifiziert den client als getrennt, falls er über X zeiteinheiten keine aktionen mehr gesendet bekommen hat. dies impliziert natürlich, dass der client in konstanten zeitintervallen aktionen an den server sendet. sollte keine nutzeraktion stattgefunden haben, wird halt eine leere aktion gesendet (die z.b. lediglich die position des spielers o.ä. enthält).


----------

