Razer Member
Anmeldedatum: 31.05.2009 Beiträge: 1796
|
Verfasst am: 30.05.2011, 19:32 Titel: Lidgren Tutorial: Basic-Knowledge, Protokolle und Bewegung |
|
Guten Tag Community.
Aufgrund der Anfrage von messy habe ich mich gestern und heute hingesetzt und ein Lidgren Sample geschrieben.
Weiterer Grund war die häufige Nachfrage wie das geht.
Verwendete Lidgren-Version: Lidgren Network Gen3 - 2011/05/18
Inhalt: Server (Konsolenanwendung), Client (XNA Game)
Kommentiert: Ja
Weitere Information: XNA 4, .Net 4, C#, Visual Studio 2010
Was wird gezeigt?
Das Sample zeigt die Funktionsweise von Server und Client auf simple Weise, wie Protokolle funktionieren und welchen Sinn diese haben sowie die allgemeinen Grundlagen von Lidgren (Server suchen, Connecten, Message-Sending, Verwaltung, ...).
Wie wird es gezeigt?
Server:
- Verwaltet die Clients
- Leitet die Positionsänderung von Clients an alle restlichen weiter
- Meldet Connects/Disconnects an alle Clients
Client:
- Bewegen vom eigenen Spieler
- Anzeige aller anderen Clients
- Senden der Positionsangaben jede 1/3 Sekunde
Anmerkung
Bitte auch die "Protokoll.txt" lesen. Dort steht die Beschreibung des Protokolls sowie einige Informationen die man bezüglich dieses Themas beachten sollte.
Falls das hier gut ankommt schreibe ich vielleicht eine Serie, in der auch weitere Dinge wie Data-Loss, Latenzen, Cryptography, Message-Orders, uvm. (grade weil ich das Thema bald brauchen werde und es mich sehr interessiert).
Verbesserungsvorschläge und Korrekturen gern gesehen!
Download |
|
| Nach oben |
|

|
JeReT Member
Anmeldedatum: 19.07.2007 Beiträge: 3248 Wohnort: µnchen
|
Verfasst am: 30.05.2011, 19:38 Titel: |
|
Habs mir zwar noch nicht durchgelesen, aber ich finde es wirklich super, dass du das gemacht hast
Werd es mir bei gelegenheit mal anschaun. _________________
Shapes |
|
| Nach oben |
|

|
Shinobi Member
Anmeldedatum: 15.09.2009 Beiträge: 582 Wohnort: NRW/Kreis GT
|
Verfasst am: 30.05.2011, 19:56 Titel: |
|
Coole Sache
Werds mir auch mal morgen zu Gemüte führen _________________ Sobalds Studium winkt, wieder Zeit zum Entwickeln, solang hiermit beschäftigt  |
|
| Nach oben |
|

|
Razer Member
Anmeldedatum: 31.05.2009 Beiträge: 1796
|
Verfasst am: 30.05.2011, 20:01 Titel: |
|
Ich muss persönlich sagen dass mir dieses Themengebiet sehr gut gefällt.
Und da hier zu viele immer das (im Grunde) selbe gefragt haben: Wie man Lidgren verwendet,
hab ich mir gedacht mach ich das doch mal.
Das Sample wurde mit 6 laufenden Clients getestet: fehlerfrei.
Das Prinzip zeigt eben gut, wie man sowas macht. Und da es doch noch schwereres gibt, werde ich ggf. das Sample ausbauen und z.B. Schüsse einbauen.
Denn es gibt doch noch viele wichtige Dinge zu Lernen. Zum Beispiel was Machen wenn Packete verloren gehen, wie man Vorausberechnet und vorallem wie man Kritische Situationen meistert ohne das Spiel für einen oder mehrere stark zu beeinflussen.
Für die die folgendes Fragen: Warum ruckelt das Bewegen denn so?
Das liegt daran, dass es nicht gedacht ist, Frame-genaue Bewegungen zu machen. Normal sendet man die Position nur alle (in dem Fall 1/3 Sekunden) um den Server nicht zu überlasten und die Datengröße gering zu halten.
Clients berechnen daher normal die Position vorraus, falls mal eine Weile keine neue Positionsangabe ankommt, bzw. berechnet die Bewegung so, dass sie flüssiger wird. |
|
| Nach oben |
|

|
messy Member
Anmeldedatum: 05.04.2011 Beiträge: 150 Wohnort: Flensburg
|
Verfasst am: 30.05.2011, 20:46 Titel: |
|
Hey Razer,
erstmal super, dass du das so schnell geschafft hast! Und noch besser ist, dass du weiterhin Lust darauf hast.
Klappt auch wunderbar. Was ich interessant finde ist, dass der Client bestimmt wie oft gesendet wird. Der Server schickt immer, wenn er Daten empfängt. Ich hatte das bisher immer so gelöst, dass der Server seine festen Sendezeiten hat.
Super auskommentiert und verständlich geschrieben. Wenig, aber schlauer Code (so weit ich das beurteilen kann ). Nur deine Spielfigur lässt ein wenig zu wünschen übrig.
Leider sind die Aspekte, die mich brennend interessieren in diesem vorzüglichen Starter-Tutorial noch nicht drin. Was mich interessieren würde (und was schon auf deiner Liste steht) ist, wie stellt man flüssige Bewegungen da und wie geht man mit Latenzen und Data-Loss um. Lidgren bietet ja die Möglichkeiten eben dies zu simulieren.
Erstmal vielen Dank für deine Arbeit. _________________ XNA 4.0 - PC/Phone |
|
| Nach oben |
|

|
Razer Member
Anmeldedatum: 31.05.2009 Beiträge: 1796
|
Verfasst am: 30.05.2011, 20:58 Titel: |
|
Sammelt mal was euch interessiert. Ich werd mich dann mal dran setzen und dazu ein paar Artikel verfassen (ggf. in meine Blog, weiß nicht ob ich XNAmag überschwemmen darf ) und mach Samples dazu.
Data-Loss und Latenzen interessieren mich persönlich mehr.
Das mit den Animationen muss ich mir selbst erstmal anschauen, da bin ich noch nicht wirklich fit drin (hab das noch nie gebraucht).
Es gibt viele Wege nach Rom. Das Problem ist, wenn der Server die Sendezeit beschränkt, dass dieser ggf. High-Priority Nachrichten später verzögert sendet. Da müsste man sich ein Prioritäten System programmieren.
Ich hab auch schon überlegt ob ich nicht ein kleines Framework als Aufsatz für Lidgren programmieren sollte ... ^^
Man müsste noch verdammt viel optimieren, Prioritäten setzen und die Abwicklung der Aufgaben / Messages besser umsetzen,
aber das würde den Rahmen sprengen  |
|
| Nach oben |
|

|
messy Member
Anmeldedatum: 05.04.2011 Beiträge: 150 Wohnort: Flensburg
|
Verfasst am: 30.05.2011, 21:07 Titel: |
|
Da fällt mir auf: | Zitat: | | - Senden der Positionsangaben jede 1/3 Sekunde |
Dein f_sendInterval ist allerdigns auf 0.03f gesetzt.
| Zitat: | Data-Loss und Latenzen interessieren mich persönlich mehr.
Das mit den Animationen muss ich mir selbst erstmal anschauen, da bin ich noch nicht wirklich fit drin (hab das noch nie gebraucht). |
Mich interessiert das auch, aber ich habe es nicht hinbekommen.
Noch nie gebraucht? Wie bist du denn bisher mit den ruckligen Bewegungen umgegangen?
Warum eigentlich ReliableUnordered und nicht Unreliable? Reicht das nicht aus? _________________ XNA 4.0 - PC/Phone |
|
| Nach oben |
|

|
Razer Member
Anmeldedatum: 31.05.2009 Beiträge: 1796
|
Verfasst am: 30.05.2011, 21:35 Titel: |
|
Hmm, ja in manchen Fällen könnte man Unreliable nutzen.
Wichtig ist bspw. beim Übertragen der ID zum Clienten, dass dieser diese sicher bekommt um Fehler später zu verhindern.
Da passt das.
Ich berücksichtige das. Werde das Sample spätestens morgen updaten, denn ich hab noch ein paar Dinge die ich dringend einbauen will.
Gerade eben habe ich z.B. Threading in den Server eingebaut, denn das ist eigentlich doch sehr wichtig.
Und zum Sendeintervall: Da hab ich mich wohl vertan ...
Es kommt jedenfalls noch ein bisschen was dazu  |
|
| Nach oben |
|

|
messy Member
Anmeldedatum: 05.04.2011 Beiträge: 150 Wohnort: Flensburg
|
Verfasst am: 30.05.2011, 21:39 Titel: |
|
Hehe, okay. Ich bin gespannt.
Ich schreibe trotzdem weiter, wenn mir etwas auffällt.
Das Sendeintervall soll 0.3 Sek sein oder? Sonst würde doch ein zu großer Traffic auftreten. _________________ XNA 4.0 - PC/Phone |
|
| Nach oben |
|

|
Razer Member
Anmeldedatum: 31.05.2009 Beiträge: 1796
|
Verfasst am: 30.05.2011, 21:45 Titel: |
|
Da es momentan 0.03 ist, nein das passt so.
Ich bin mir auch nicht 100% sicher was das richtige Intervall ist. Traffic ist bei solch einem Spiel jetzt noch nicht ganz so schlimm.
Also ich mein damit, die paar Positionsangaben machen da nicht so viel aus ^^ |
|
| Nach oben |
|

|
messy Member
Anmeldedatum: 05.04.2011 Beiträge: 150 Wohnort: Flensburg
|
Verfasst am: 30.05.2011, 21:50 Titel: |
|
Auch wenn das bei diesem Spiel noch nicht schlimm, glaube ich, dass ca. 33 Snapshots die Sekunde doch recht viel ist.
Noch was anderes:
Der Client empfängt die Positionsdaten der anderen Spieler und aktualisiert diese. Seine eigenen Angaben werden aber nicht vom Server "geprüft" oder? _________________ XNA 4.0 - PC/Phone |
|
| Nach oben |
|

|
Razer Member
Anmeldedatum: 31.05.2009 Beiträge: 1796
|
Verfasst am: 30.05.2011, 22:03 Titel: |
|
Wie meinst du das mit geprüft?
Ein Client sendet seine Position und der Server verteilt sie an alle anderen.
Zu prüfen gibt es in diesem Fall nichts  |
|
| Nach oben |
|

|
messy Member
Anmeldedatum: 05.04.2011 Beiträge: 150 Wohnort: Flensburg
|
Verfasst am: 30.05.2011, 22:48 Titel: |
|
Ich meine dem Cheaten vorbeugen, aber das ist für ein Sample zu weit ausgeholt.
Also, der Client könnte seine Position manipulieren und an den Server schicken. Der Server verteilt diese blind ohne diese gegenzuprüfen.  _________________ XNA 4.0 - PC/Phone |
|
| Nach oben |
|

|
Razer Member
Anmeldedatum: 31.05.2009 Beiträge: 1796
|
Verfasst am: 30.05.2011, 23:08 Titel: |
|
Ja, wie du sagst, sowas sprengt das Sample.
Natürlich sollte man sowas einbauen  |
|
| Nach oben |
|

|
messy Member
Anmeldedatum: 05.04.2011 Beiträge: 150 Wohnort: Flensburg
|
Verfasst am: 30.05.2011, 23:43 Titel: |
|
Ich habe mal versucht einen flüssigen Bewegungsablauf einzubauen. Klappt soweit bis auf ein paar Kleinigkeiten. Ich poste morgen mal mein Ergebnis. Jetzt hindern mich meine Kopfschmerzen am weiter machen.  _________________ XNA 4.0 - PC/Phone |
|
| Nach oben |
|

|
|