Autor Beitrag
MarkusD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mi 09.05.07 17:05 
Hallo,

also ich habe ein kleines JumpNRun-Spiel programmiert. Jetzt bin ich dabei eine Netztwerkunterstützung reinzubauen.
Nur weiß ich nicht wie ich das ganze synchronisieren soll.

Ich habe mal versucht einfach sehr oft die Koordinaten des Spielers zu schicken.
-> im Netztwerkt, bzw. localhost funktionierts, ist aber sicherlich ineffizient.
-> Internet... da ist der Ping halt zu hoch, das bedeutet es ruckelt ganz schön.

Dann habe ich versucht einfach die gedrückten Tasten zu übergeben, und die Berechnung selbst auf jedem PC zu machen.
-> war ja klar was passieren musste.. irgendwann stimmt die position nicht mehr und der Spieler ist wo ganz anders als er sein sollte.

Dann habe ich versucht eine "Mischung" aus beiden zu realisieren. Das funktioniert eingentlich bis auf den Fakt, dass der Spieler manchmal
"Sprünge" macht, also erst an der falschen Position ist, und wenn die neuen coords kommen wird es "wegteleportiert".

Das ganze läuft mit TServer/ClientSockets, und ja ich weiß das die nicht die besten/schnellsten sind. Aber mit anderen Sockets
dürfte das auch nicht besser sein. Außerdem möchte ich nur ein Prinzip wissen, wie man sowas ruckelfrei realisieren kann.
In Onlinegames ruckelt man ja auch nicht rum, obwohl das ganze noch über nen Server geht, bir mir ist es P2P.

Markus
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 09.05.07 17:22 
user profile iconMarkusD hat folgendes geschrieben:
In Onlinegames ruckelt man ja auch nicht rum

Schonmal World of Warcraft gespielt? Titan Quest? Letzteres verursacht sogar im LAN ab und zu Sprünge.
Eine Mischung aus beidem ist auf jeden Fall nicht schlecht. Ich würde mir überlegen, bei jedem Tastendruck sowohl Position als auch den Tastendruck zu senden, so kommts seltener zu solchen Sprüngen. Aber Erfahrung hab ich auf dem Gebiet nicht, das war nur, was ich so als Brainstorming Beitrag leisten würde ;)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
MarkusD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mi 09.05.07 17:27 
Danke für die antwort. Werde mal versuchen wirklich nur dann die coords zu senden.

Zu WoW: Solche Spiele werden aber auch sicher mehr daten übertragen als ich :D
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 09.05.07 18:11 
Moin!

user profile iconMarkusD hat folgendes geschrieben:
Außerdem möchte ich nur ein Prinzip wissen, wie man sowas ruckelfrei realisieren kann.
In Onlinegames ruckelt man ja auch nicht rum, obwohl das ganze noch über nen Server geht

Das ist einer der schwierigsten Teile einer solchen Anwendung! :hair: Du brauchst dich also nicht zu wundern, wenn du das nicht auf anhieb hinkriegst. ;) Gerade die hohe Latenzzeit über Internetverbindungen ist die krasseste Hürde, die alle (auch Profi-Online-Games) haben! :mahn: Aber dafür gibt es leider keine "Patentlösung"... :(

user profile iconMarkusD hat folgendes geschrieben:
bir mir ist es P2P.

Du machst P2P mit TCP? :? Hmm, evtl. kannst du dann mit UDP doch noch was herausholen. :idea: :nixweiss:

user profile iconMarkusD hat folgendes geschrieben:
Das ganze läuft mit TServer/ClientSockets, und ja ich weiß das die nicht die besten/schnellsten sind. Aber mit anderen Sockets dürfte das auch nicht besser sein.

So ist es, das sehe ich genau so. Es stecken letztlich auch nur die WSA-Sockets dahinter, egal welcher Wrapper das kapselt. Und an der Performance des Serverprozesses liegt es ja nicht, wie du schon korrekt erkannt hast, sondern an den teilweise hohen Verzögerungen über die Internetverbindung. Allerdings spielt es hier noch mal eine Rolle, ob TCP oder UDP :arrow: wäre einen Versuch wert. :D

Du kannst das Problem nie wirklich beseitigen, sondern nur mit sehr viel Aufwand "tarnen". ;) Das ganze läuft hauptsächlich über eine geschickte Planung des Ereignissystems im Spiel. Schau dir z.B. mal Diablo 2 an, da finde ich, ist das schön zu sehen, wenn man zwei Rechner nebeneinander stellt, die beide über eine Internetverbindung mit einem Server verbunden sind. Wenn man da mit der einen Figur irgendwo hinläuft, wird zunächst die "Absicht" (=lauf da hin) gesendet und dann, sozusagen, wenn "Zeit ist", die aktuellen Koordinaten abgeglichen. Letztlich wird aber immer soviel wie möglich an Berechnung den Clients überlassen und dann die Ergebnisse abgeglichen. Das führt dann zwar leider immer noch manchmal zum "Springen/Teleportieren", aber die Qualität ergibt sich dann aus der Häufigkeit, mit der das passiert. ;)

cu
Narses

//EDIT: Vielleicht kann man das Fazit so fassen: die "Kunst" besteht darin, dass es nicht wirklich "gleichzeitig" sein muss, sondern dass es jeder Client für sich gesehen für gleichzeitig hält :!: IdR hat man an seinem Client ja keine Vergleichsmöglichkeit, so dass es "ausreicht", wenn die Aktionen einigermaßen folgerichtig Ablaufen. Beispiel aus D2: wenn du eine Schatzkiste anklickst, dann wird sofort ein Reservierungsanfragepaket an den Server gesendet, der dieses beantwortet (ja, du hast die Kiste als Erster angeklickt oder eben nicht), danach erst generiert der Server den Inhalt und sendet ihn an die anderen Clients. Hat jemand kurz nach dir (aber noch vor dem "Auspacken") auch auf die Kiste geklickt, dann kann er diese nicht mehr reservieren und der Client passend darauf reagieren, als ob die Kiste schon offen wäre. Kurz darauf purzelt dann der Inhalt raus, aber das merkst du kaum noch. :idea: ;) Das ganze kombiniert mit etwas Finetuning in Form von Nachrichtenprioritäten (kurze Statusinfos sind wichtiger und werden sofort weitergeleitet, größere Detaildatenpakete werden "wenn Zeit ist" gesendet), und schon wirkt ein Spiel "flüssiger". ;) Jetzt muss man das nur noch eben umsetzen... :rofl:

_________________
There are 10 types of people - those who understand binary and those who don´t.
MarkusD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 10.05.07 16:51 
Ok, danke Narses.

Werde dann wohl ein bisschen "rumbasteln" müssen. Ich hab mit UDP zwar keine erfahrung, aber ich kann mir das ja mal anschauen. Da haste ja auch ein schönes Tutorial :D
sirrk
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 16.12.07 14:00 
Moin.

Ich bin nciht sehr bewand auf dem Gebiet, habe aber trozdem eine Idee. Ich könnte mir vorstellen von Anfang an des Levels jeden Frame zu zählen. Wenn man nun Daten übermittelt, wie z.b. x / y Position und X / Y Geschwindigkeit, übermittelt man gleichzeitig die Information, in welchem Frame das ganze stattgefunden hat. Die aktuelle Position muss dann hochgerechnet werden...^^ Leider habe ich keine Ahnung wieviele Frames ein solcher Delay denn entspricht, und allgemein habe ich von Verbindungen übers Netzwerk oder übers Internet keine Ahnung. War einfach ne Idee.^^
Corpsman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228

KUbuntu 10.4
Lazarus
BeitragVerfasst: So 16.12.07 14:46 
Hossa,

ich habe ja mein Balanced auch Netzwerkfähig gemacht. Und dank Hamachi ist es auch I-net fähig.

Ich mache alles über UDP.

Ich sende immer alle Daten des Players, Also Position Geschwindigkeit Torsion. Und das so oft es geht.

Wenn dann mal Datenpackete Verloren gehn ist es nicht so schlimm und Ruckelt nur wenig, da der Empfänger mit hilfe der Physik engine ja den anderen "Simuliert" und bei guter Leitung die Daten immer stimmen.

Einziges Problem. Wenn die Rechner deutlich unterschiedliche Ressourcen haben. BZW der eine 20 FPS und der andere 180 um das zu beheben habe ich ne Beschränkung gemacht, die Rechner senden also immer nur alle 20 ms oder so.

Diese Variante tut eigentlich wunderbar, ( auser Win98 mit WinXP , da hat es immer ein LEak von knapp 2000 ms gegeben ... ).

_________________
--
Just Try it.
sky21
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Di 15.01.08 17:20 
Falls du weiterhin TCP verwendest würde ich noch das PST (PUSH) Flag setzen, damit die Daten sofort gesendet und nicht gebuffert werden....
Corpsman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228

KUbuntu 10.4
Lazarus
BeitragVerfasst: Di 15.01.08 17:53 
ho,

Ich nutze TCP nur für Menues,

Die eigentlichen in Game Daten werden via UDP versendet.

_________________
--
Just Try it.