Hallo Zusammen,
nach einem langen Auslandsaufenthalt, bin ich nun wieder zurückgekehrt mit vielen neuen Ideen.
Mir schwirrt schon lange der Wunsch einer Engine extra für Netzwerk Multiplayerspiele im Kopf rum.
Gelesen habe ich dies bezüglich schon recht viel und habe schonmal
ein paar feste Ideen aber auch ein paar Fragen sind geblieben:
TCP oder UDP ?
Diese Frage ist natürlich die wichtigste. Gelesen habe ich, dass für ein solches Vorhaben UDP gegenüber TCP überlegen ist,
undzwar in der Hinsicht, dass es z.B. verlorene Pakete nachschickt und dadurch alle Clienten lansamer werden.
Quelle: Game Development Tutorials – Game Networking – UDP vs. TCP
Übermittlung der Koordinaten/Änderungen/Sonstige:
Zu dem Thema hab ich mir den Wikiartikel zur Sourceengine durchgelesen und war recht überrascht, wieviele Tricks
dort angewendet werden, um das Spielen derart angenehm zu machen. Stichworte wären Movement Prediction und
Latency Compensation.
Aber meine erste Idee war eigentlich eine ganz andere: Die Clienten wissen Sachen wie Geschwindigkeit, Rotationsgeschwindigkeit
und Position, um praktisch alle notwendigen Schritte selbst zu berechnen. Damit die Clienten nicht aus dem Takt geraten, dachte ich daran, vom Server alle 25 ms ein Signal zu schicken, dass jeden Clienten auffordert einen Rechenschritt durchzuführen.
Dies könnte (müsste) dann über TCP geregelt werden. Änderungen von anderen Spielern werden dann bei diesem
25ms Update ggf. an die Clienten mitgesendet.
Allerdings wären dann wieder 2 Probleme existent:
-Wenn ich eine Änderung vornehme als Client (Z.B. ein Schuss...) dann würde dieser verzögert geschehen. Was für das Spielverhalten grottig ist. Sprich auch dann müsste ich etwas ähnliches wie Movement Prediction impl.
-Ich MUSS davon ausgehen können, dass Floatoperationen auf allen PCs exakt gleichausgeführt werden. Nur dann, kann ich dem
Client die Aufgabe geben, alles selbst zu berechnen, was natürlich auch den Server erheblich entlasten würde.
=> An dieser Stelle eine wichtige Frage: Ist das bei Java garantiert ?? Ich weiß, dass das bei C/C++ Plattform- und Kompilerabhängig ist, wodurch dies nicht möglich wäre mit den "alten" Sprachen. Meine Hoffnungs ist, dass durch das
Prinzip der virtuellen Maschiene dies garantiert ist. Andererseits ist die JVM ja auch nur in C oder was auch immer geschrieben und
diese wiederum beuntzt ja die Prozessor-internen Befehle für die Standard Operationen. Vlt. könnt ihr da etwas Licht ins dunkel bringen
Gruß,
Chris
nach einem langen Auslandsaufenthalt, bin ich nun wieder zurückgekehrt mit vielen neuen Ideen.
Mir schwirrt schon lange der Wunsch einer Engine extra für Netzwerk Multiplayerspiele im Kopf rum.
Gelesen habe ich dies bezüglich schon recht viel und habe schonmal
ein paar feste Ideen aber auch ein paar Fragen sind geblieben:
TCP oder UDP ?
Diese Frage ist natürlich die wichtigste. Gelesen habe ich, dass für ein solches Vorhaben UDP gegenüber TCP überlegen ist,
undzwar in der Hinsicht, dass es z.B. verlorene Pakete nachschickt und dadurch alle Clienten lansamer werden.
Quelle: Game Development Tutorials – Game Networking – UDP vs. TCP
Übermittlung der Koordinaten/Änderungen/Sonstige:
Zu dem Thema hab ich mir den Wikiartikel zur Sourceengine durchgelesen und war recht überrascht, wieviele Tricks
dort angewendet werden, um das Spielen derart angenehm zu machen. Stichworte wären Movement Prediction und
Latency Compensation.
Aber meine erste Idee war eigentlich eine ganz andere: Die Clienten wissen Sachen wie Geschwindigkeit, Rotationsgeschwindigkeit
und Position, um praktisch alle notwendigen Schritte selbst zu berechnen. Damit die Clienten nicht aus dem Takt geraten, dachte ich daran, vom Server alle 25 ms ein Signal zu schicken, dass jeden Clienten auffordert einen Rechenschritt durchzuführen.
Dies könnte (müsste) dann über TCP geregelt werden. Änderungen von anderen Spielern werden dann bei diesem
25ms Update ggf. an die Clienten mitgesendet.
Allerdings wären dann wieder 2 Probleme existent:
-Wenn ich eine Änderung vornehme als Client (Z.B. ein Schuss...) dann würde dieser verzögert geschehen. Was für das Spielverhalten grottig ist. Sprich auch dann müsste ich etwas ähnliches wie Movement Prediction impl.
-Ich MUSS davon ausgehen können, dass Floatoperationen auf allen PCs exakt gleichausgeführt werden. Nur dann, kann ich dem
Client die Aufgabe geben, alles selbst zu berechnen, was natürlich auch den Server erheblich entlasten würde.
=> An dieser Stelle eine wichtige Frage: Ist das bei Java garantiert ?? Ich weiß, dass das bei C/C++ Plattform- und Kompilerabhängig ist, wodurch dies nicht möglich wäre mit den "alten" Sprachen. Meine Hoffnungs ist, dass durch das
Prinzip der virtuellen Maschiene dies garantiert ist. Andererseits ist die JVM ja auch nur in C oder was auch immer geschrieben und
diese wiederum beuntzt ja die Prozessor-internen Befehle für die Standard Operationen. Vlt. könnt ihr da etwas Licht ins dunkel bringen
Gruß,
Chris