Snowball

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Tagchen!

Ich weiss dass jemand mal recht weit gekommen ist mit so ner Echtzeit
Netzwerk sache. War so n Flugzeugspiel oder in der Art, dürfte noch zu
Zeiten des alten Forums gewesen sein.
Dann gäbe es da ja auch noch Stargate. Sein Dune und auch das Snooker
game dürften recht umfangreichen Netzwerk code haben.

Aber was dein Pong angeht:
Wo haperts denn?
An sich sollte das ziemlich leicht synchron zu kriegen sein.
Brauchst ja im Prinzip nur die Infos ob getroffen wurde, wo der Ball
getroffen wurde, in welche Richtung er zurückfliegt und für den Fall einer
Richtungsänderung des Schlägers, die jeweilige Richtung bzw. das Ende
der Bewegung.
Der rest lässt sich ja eigentlich auf dem jeweiligen client berechnen.
Wenn dus so anpackst vermute ich, sollte zumindest n pong synchron
zu kriegen sein.


Greetz
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

das problem bei Pong ist aber, das beide PC genau die gleichen rechnungen durchführen müssen, nach dem der Server die Startparameter des Balls weitergegeben hat, denn sonst könnten beim längeren Spielen abweichungen in der Position autreten.

Das Problem ist dann aber, das wenn ein PC langsammer im rechnen ist, würde der Ball zwar die selbe Position erreichen, aber zu einer anderen Zeit, ein Faktor zum außgleich der CPU Leistung würde aber wiederum zu anderen Rechnungen führen.

Ist schon n interessanten Thema, vorallem bei so schnellen spielen wirds schwer.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Das sehe ich jetz eigentlich nicht als Problem an, denn die parameter des
Balls werden ja bei jedem auftreffen auf den Schläger neu übergeben.
Kann sein dass ich hier n Verständnispoblem hab, aber ich denke dass
dadurch keinerlei positionsunterschiede entstehen dürften - zumindest
was den Ball angeht.
Schlimmstenfalls hüpft er einmal kurz wenn sich die Koordinaten
unterscheiden - da nimmt der client im zweifelsfall die neu übermittelten
Daten.

Aber wie gesagt - vllt hab ich da jetz auch nur n verständnisproblem,
wenn ja lass ich mich gerne belehren ^^


Grüße
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ja gut ok, wenn bei jeder Schlägerberührung die positions des Balles an alle neu übergeben wird, dann tritte kein fehler auf.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Ich hab neulich angefangen, ein synchrones Netzwerk-Pong zu schreiben, und es ist schwieriger, als man denkt. Hatte hier vor Ewigkeiten meinen ersten Versuch gepostet, aber der war komplett scheiße ;)
Das neue ist so gesehen viel besser, aber leider noch nicht fertig und auch noch lange nicht perfekt. Ich hoffe, ich krieg's hin, dann werd ich's zur Verfügung stellen, meiner Meinung nach ist Pong perfekt um Netzwerk-Programmierung zu erlernen und Synrhonisationen zu testen.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
RaVeN99
Beiträge: 310
Registriert: 29.08.2004 15:26
Wohnort: Weiden i.d.OPF
Kontaktdaten:

Beitrag von RaVeN99 »

Wo biste denn auf probleme gestoßen wenn ich fragen darf?
Geht zwar vllt. n bissel off-topic, aber vllt. kommt dabei auch noch was
raus, was Lebostein helfen könnte?


Grüße
RaVeN
AMD Athlon64 3000+, 1024MB DDR-RAM, Geforce 8600GT, WinXP SP2, DirectX 9.0c, PureBasic 3.94
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Erlich gesagt stell ich mir Pong auch nicht wirklich als schwer vor. Weis
nicht ob RaVeN99 das so meint, aber bei Pong gibt es ja nur 3 mögliche
Kollisionsarten:

- Ball trifft Schläger von Spieler 1
- Ball trifft Schläger von Spieler 2
- Ball trifft Begrenzung (Oben/ Unten/ Links/ Rechts)

Die Begrenzungen sind fest, damit im prinzip vernachlässig bar.
Interessant sind also die Kollisionen mit den Schlägern. Das Problem
besteht dahin, den Schläger des jeweiligen Spielers mit dem Ball zu
syncronisieren. Da es sich hier aber nur um 2 mögliche Kollisionen
handelt, die von einem neutralen Objekt durchgeführt werden ... ist die
wohl simpelste Lösung, wenn der jewiege Client des zugehörigen
Schlägers die Berechnung durch führt.

Das ganze würde dann in etwa so ablaufen:
Zeitsyncronisation der Clients/ Server
Ball startet richtung Spieler 1
-> Client 1 (von Spieler 1) bekommt die Position, Zeit, Flugwinkel, Geschwindigkeit des Balls
-> Client 1 berechnet die nächsten Positionen des Balls und schickt Position, Zeit, Flugwinkel,
Geschwindigkeit in einem kurzen Intervall zum Client 2
-> Ball schlägt auf Begrenzung oben -> änderung des Flugwinkels
-> Ball schlägt auf den Schläger von Spieler 1
-> Position, Zeit, Flugwinkel, Geschwindigkeit werden an Client 2 gesendet
-> Client 2 übernimmt die berechnung des Balls
-> Client 2 berechnet nun die nächsten Position des Balls und schickt Position, Zeit, Flugwinkel,
Geschwindigkeit in einem kurzen Intervall zum Client 1
-> usw.

Der Client, der gerade nicht zur berechnung der Ballposition genutzt wird,
wird natürlich weiterhin die aktuelle Position anhand der zuletzt
empfangenden Daten berechnen.

Die Positionen des Schlägers werden vom jeweiligen Client an den
anderen Client gesendet. Fals der Schläger eine Geschwindigkeit
(eventuell sogar Beschleunigung und Bremskraft) hat, könnte der jeweils
andere Client auch den Schläger des Gegners anhand der letzten
empfangenden Daten ermitteln.

Interessant wirds, wenn ein einziger Server das alles berechnen soll. In
beiden Fällen ist aber die Zeitsyncronisation am Start wichtig, im zweiten
falle natürlich besonders. Aber wenn die Zeitsyncronisation am Start
ordentlich klappt, sollte auch die Nachträgliche Berechnung kein Problem
sein. So würd ich zumindest an die Sache rann gehen :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Also meine Vorgehensweise war nach "Dead Reckoning"-Art, sprich, die Positionen der Schläger und des Balls werden immer anhand der letzten Position und der letzten Richtungsänderung berechnet. Somit ist es möglich, auch in die Zukunft zu schauen, aber ich glaube, daß Pong dafür eher das falsche Spiel ist :D

Jedenfalls synchronisiere ich am Anfang Server und Client, indem ich ermittle, wie groß der durchschnittliche Zeitunterschied ist. Während des Spiels ermittelt in der Hauptschleife jeder immer die aktuelle Zeit, allerdings wird die mit der Latenz so berechnet, daß die Timestamps tatsächlich synchron sind. Jetzt kann z.B. der Client seine Richtung ändern, und diese Information wird dem Server geschickt. Sobald er die Daten erhält, kann er 100%ig ausrechnen, wo der Client ist und wohin er sich bis zur nächsten Richtungsänderung auch bewegen wird. Das heißt, zu bestimmten Zeitpunkten ist das Bild, was beide sehen, absolut synchron. Allerdings gibt es auch viele Zeitpunkte, wo das NOCH nicht der Fall ist, z.B. bewegt sich der Client gerade auf beiden Bildern abwärts, doch dann bewegt er sich nach oben, wovon der Server erst ein paar Millisekunden später Notiz nimmt. Sobald dies der Fall ist, wird eben der Schläger wieder korrekt angezeigt, was bedeutet, daß er beim Server zunächst weiter unten ist, als er je war, dann allerdings regelrecht nach oben springt und bis zum nächsten Richtungswechsel auch wieder korrekt positioniert ist.

Viele Spiele gehen dann so vor, daß zwischendrin interpoliert wird, also daß dieser Sprung nicht so stark auffällt. Und dann ist es eben oft noch so, daß auch der Client ein bißchen Mitspracherecht hat und selbst sagt, ob er nun getroffen hat oder nicht. In dem Fall könnte man das an den Server schicken, und er hätte dann aber das letzte Wort (um Cheaten natürlich zu verhindern).

So etwas hab ich allerdings noch nicht eingebaut, wollt ich eigentlich noch machen. Wenn sich hier aber jemand übelst krass mit Netzwerk-Synchronisation auskennen sollte, kann ich den Code auch einfach posten und ihn von diesem jemand erweitern lassen.

Eins noch: Es war mir nicht möglich, UDP zu verwenden... das ist natürlich auch noch ziemlich blöd :/
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Vielen Dank für die vielen Ausführungen. Werde mich nächstes WE mal ransetzen.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Re: Snowball

Beitrag von Lebostein »

*Hervorkram*

Gerade viel mir beim Aufräumen wieder meine alte Schneeballschlacht in die Hände. Leider hat sich in den letzten 3 Jahren nichts getan. Eigentlich hatte ich ja mal vor gehabt, da ein richtiges Mehrspielerspiel daraus zu machen. Gibt es in der Zwischenzeit vielleicht ein gutes Beispielprogramm/Tutorial, dass sich mit Mehrspieler, Echtzeit, Synchronisierung usw. speziell in PureBasic beschäftigt?
Antworten