UDP Datenmengen?
Übersicht

JeyBetreff: UDP Datenmengen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also mir ist kein richtiger Titel eingefallen. Ich habe im Moment ein Problem, wenn es darum geht, dass der Server dem Clienten sobald er einloggt alle Items und Spieler mitteilt, die bereits eingeloggt sind. Problem hierbei ist, dass wenn ich mehr als ca. 400 Nachrichten an den Neuankömmling schicke, dieser nur Teile davon empfängt.
Ich habe mit Netzwerk noch nicht viel Erfahrung, hab aber gelesen, das prinzipiell nichts verloren geht. Also Daten nur auf dem Weg von einem zum anderen Rechner verloren gehen sobald sie den Zielrechner dort erreicht haben aber dort In einer "Schlange" warten abgeholt zu werden. Daher kann ich mir den Datenverlust nicht erklären, da bei geringeren Mengen doch auch keine Daten verloren gehen. Oder gehen die Daten doch bei zu langer Zeit bis man sie ausliest verloren? Das wäre meine erste Frage, meine zweite passt vieleicht nicht hier her, aber wenigstens ist mein Problem bekannt. Falls die Datenmenge zu viel wird, die der Server beim einloggen eines Spielers versenden muss, wird dieser ja auch sehr langsam. Ich habe gelesen, das Multi threading von BB nicht unterstützt wird. Wie regelt ihr sowas? Bastelt ihr da eine eigene Funktion, die das schrittweise versenden der Daten ermöglicht? Ich danke euch schonmal im vorraus ![]() |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zum ersten: Die Daten gehen auf ihrem Weg durchs WWW verloren, da kann man nix machn.
Nimm TCP, um eine empfangs-Garantier zu haben, allerdings ist TCP langsamer, eben weil es eine Empfangs-Garantier hat. Zum zweiten: Ka, hatte das Problem noch nicht. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Um was für ein Spiel handelt es sich?
Sofern es kein Shooter oder ähnlich action reiches Spiel ist (also bloss online RPG oder ähnliches, was zum grossteil auf mathematischen Formeln basiert und nicht auf reinem ingame verhalten wie zielen und abdrücken), dann wäre TCP ohnehin vorzuziehen, da hier jedes Packet von bedeutung ist. Bei shootern ist dem ja nicht so, da wird sehr viel interpoliert ... |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
nX^ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja UDP bei Spielen wo ziehmlich oft die Pos übertragen wird, weil wenn mal ein Packet verschwindet macht es keinen Unterschied weil die Pos immer in einer bestimmten Zeit übertragen wird zb alle 30 ms.
TCP ist besser für Textadventures oder Abenteuerspiele wo nicht viel geschickt wird aber da ist es wichtig das die Daten ankommen. |
||
gamble |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Textadventures mit Multiplayer-Modus? | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Denke er meinte TextRollenspiele (MUD) | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Jey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Es handelt sich um ein RPG...mit massig items und gegnern. Ich denke ich werde TCP für wichtige Dinge wie Handeln, und Spielertod verwenden. Für Position UDP. Und zu dem verlieren im WWW: Die Daten gehen auch verloren, wenn ich über Lan verbinde oder an einem Rechner 2mal den Client starte. Da denke ich eigentlich nicht, das Daten verloren gehen. Vielleicht kann der Datenstream ja nur eine bestimmte Menge Daten speichern. Aber wie gesagt ich kenne mich da nciht so aus.
Und zu der Routine, wie ich viele Daten vom Server verschicke und er nicht alles in einer Runde durchgeht, sodass dabei lagg entsteht hat da jemand ne Idee. Ist wahrscheinlich einfach nur wollte ich nochmal nachfragen weil bei so angelegenheiten ja normalerweiße Multi-threading verwendet werden (denke ich zumindest) Danke schonmal ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Davon würde ich weiten abstand nehmen!
Entweder TCP ODER UDP, aber nicht beides. Sonst wird UDP schon fast garantiert nicht mehr funktionieren, weil er vom TCP noch weiter ausgebremst wird, womit noch mehr packages verloren gehen. Wieviele Daten verschickst du denn? Ich kann mir ehrlich gesagt nicht vorstellen, dass du einfach so zuviele Daten hinbekommst, ausser du versendest die Leveldaten auch, was nicht sein sollte (statische Daten sind immer beim Client gespeichert, nur dynamische Daten und Berechnungen liegen beim Server) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Jey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also wenn ich zb 50 Spieler habe, alle Spieler noch Gefährten. Also insgesamt 100 Positionen. Dann wenn mal 400 Items liegen dann hat er schon schwierigkeiten alles zu versenden. Ich weiß es kommt selten vor, das so viele Items liegen aber ich will da lieber ne nummer sicher gehen.
Und TCP würde ich dann wie gesagt wirklich nur ganz wenig nachrichten schicken. Ich hab mir schon überlegt, ob ich jedem Spieler nur das senden soll, was er wirklich gerade sieht, aber da müsste der Server ja wissen, was jeder einzelne Spieler sieht und das bremst denke ich auch ganz schön. Andere Methode wäre die Map in Gebiete unterteilen und nur die Daten senden, wenn sich der Spieler gerade in dem Gebiet befindet. Irgendwie habe ich Momentan einfach eine Menge fragen. Du sagstest mir in einem anderen Thread, das ich für die Items eine 2Dymensionale Array nehmen soll. Aber dabei muss die maximale Anzahl der Items in einem Feld bekannt sein oder gibts da ne Lösung wie man Types mit einem 2D Feld verbindet? Dank dir |
||
Felix |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du kannst mal versuchen die daten die du gesendet hast zu kontrolieren(z.B. durch zurücksenden der daten). wenn dann etwas fehlt sendest du die fehlenden daten einfach nach.
ich hab das selbst aber noch nciht getestet ![]() |
||
Meine laufenden Projekte:
-Chat -Schachprogramm(3D) |
Jey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja denke das würde schon gehen, aber ich versuche meine nachrichten halt so klein wie möglich zu halten. Könnte so eine Routine verwenden wenn ich weiß das ich viele wichtige Daten versende. Stimmt schon.
Netzwerk fehlt mir einfach das allgemein Wissen. Ein Tutorial dafür wäre nicht schlecht. Ich kenne Zwar die Befehle und weiß wie ich sende und Nachrichten interpretiere, aber die vorgehensweise ist mir unbekannt und deswegen kann man da sehr viel Zeit verlieren. Mal eine einfache Frage: Wenn der Server die Gegner lenkt, und die Clienten ihren Spieler kommt es bei mir ganz schnell zu einem Problem. Wenn der Client seine Position sendet, die wenn sie bei dem Server ankommt bereits von einem Bot besetzt ist, müsste doch entweder der Bot zurückgesetzt werden oder dem Clienten eine Nachricht geschickt werden, das dieser wieder zurückgesetzt wird. Wollte mal fragen, wie das normalerweiße gelöst wird. Man könnte ja auch einen Sicherheitsabstand lassen das sich der Bot auf einen bestimmten Abstand gar nicht erst annähert. Denke aber das ist schlecht machbar wegen der Performence. Bei langsamen Rechnern benötigt man einen höheren Abstand, bei kurzem Netzausfall würde es dann doch zu Kollisionsproblemen kommen. Wie ihr seht hab ich echt keinen blassen Schimmer auf dem Gebiet. Bin für alle Tipps dankbar ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also habe zwar noch nicht viel mit Netzwerk gemacht, aber sende doch alle Positionen aller Gegner, Gegenständen usw. wenn sich ein neuer Client einloggt nacheinander. Der Client sammelt alle Daten und packt diese in Types. Ist der Ausgleichsstream fertig, kann das spielen beginnen. Jeder Rechner sendet dann nur noch die Daten die er grad verändert zusammen mit einer ID. Die ID wird zusammen mit den neuen Koordinationsvariablen von anderen Rechnern ausgelesen und entsprechend in eigenen Typesvariablen geändert.
Problem: Das gesammte Spiel müsste, wenn sich ein neuer Spieler einloggt, angehalten werden. Oder mach eine 'intelligente' Steuerung die das anhalten verhindern kann. Das zweitere wird allerdings nicht grad einfach sein. /EDIT: Langsame und schnelle Rechner... Zu jeder ID würde ich Positionskoordinaten und Geschwindigkeitskoordinaten senden. Jeder Rechner kann dann (auch wenn erstmal keine Daten mehr ankommen) vorraus berechnen wo sich die Gegnerischen Einheiten befinden müssten. Damit das Bewegen überall gleich schnell abläuft musst du sowieso Frame-unabhängig programmieren, dann gehts ganz von alleine. Könnte dir mal ein Testcode dazu hier posten... |
||
Jey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also Frame-unabhängig programmiere ich schon, ich denke das ist mal das Mindeste, sonst würden die Clienten mit den lahmen Rechnern nie vor nem Gegner wegrennen können während du einfach wegsprintest. ![]() Das ist mir soweit schon klar. Meine Clienten berechnen den Weg der Gegner bereits vor, da sonst eine Bewegung eher unglatt ablaufen würde. Ab und an sende ich Koordinaten sonst nur die Richtung. Dennoch ist so das Problem, das Spieler und Bot einfach übereinander laufen nicht behoben. Schließlich kann gerade in dem Moment ein Richtungswechsel stattfinden, in dem der Spieler an den Gegner herantritt. Vielleicht gibt es da ja eine ganz einfache Lösung, aber irgendwie komme ich nicht darauf ![]() |
||
![]() |
Klip |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Gegner könnte dem Server ankündigen, dass er sich 2 Tiles weiter nach unten bewegen wird, so lässt sich die Kollision im Vorraus berechnen. | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bei Bots würde ich nicht die Richtung übermitteln sondern die nötigen Daten, damit der Client die Bewegung korrekt rekonstruieren kann für die nähere Zukunft (also zb die Punkte für das Bewegugsspline oder die Bewegungspfad Daten) | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Jey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also du meinst, wenn der Bot eine bestimmte Routine hat wie er sich bewegt und der Client sie kennt könnte er sie sich selbst berechnen und der Server schickt ab und an mal Koordinaten damit keine Fehler auftreten. Also der Bot hat zb einfach einen Spieler als Ziel, die anderen Clienten wissen, welches Ziel er hat und kennen auch die Koordinaten des Ziels.
Das wäre mal ein guter Ansatz, bei dem ich eine Menge Nachrichten sparen kann. Das Problem mit der Kollision besteht jedoch weiterhin. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein das meinte ich nicht.
Der Server berechnet ja die Bots. Das heisst der Server weiss auch wohin sich die Bots in den nächsten Sekunden bewegen werden, sollte sich nichts gravierendes ändern. Insofern kann der Server die nächsten Zielfelder auch an die Clients durchgeben. Und solange sich an den Zielfeldern nix mehr ändert, muss man zu den Bots auch keine Daten mehr senden. Sollte halt was gravierendes passieren, werden sich die Zielfelder ändern und sie müssen erneut an die Clients in der Zone (also näheres Umfeld) geschickt werden. Dadurch weiss der Client schon einiges im voraus, wohin der Bot gehen wird, womit es keine "durchlauf kollision" mehr gibt, da der bot dann schon real am kollisionspunkt ist, wenn der Spieler dort ist. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja, es gilt: Der Server hat immer recht!
Stellt der Server nun eine Kollision fest, so werden die kollidierenden Spieler einfach wieder soweit zurückgesetzt, daß es zu keiner Kollision kommt und diese neue Position an die Clients übertragen, welche den Spieler entsprechend zurücksetzen. |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
Jey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich will hier nicht lästig klingen aber irgendwie kommt das ganze ja auf die Art an, wie das Bewegungsystem funtioniert.
Also bei 8 Richtungen oder so könnte ich mir das wunderbar vorstellen, wenn ich aber mit sin und cos arbeite und es daher unendlich viele Richtungen gibt (fast zumindest^), erscheint mir das nicht mehr ganz so einfach. Vieleicht ist mein ganzes System nicht für Netzwerk geeignet. Benutzt du Felder, in denen sich die Spieler bewegen? Also die Map in ein Raster gliedern und dort dann festlegen ob ein Feld belegt ist oder noch frei? Bei mir können sich alle freibewegen und die Kollision wird über rechtecke an den Füßen der Spieler geprüft. Du hast das schön beschrieben mit dem besonderen Ereignis, dass wenn es eintrifft an den Clienten gesendet wird. Aber wenn man davon ausgeht, das dieses Ereignis zb eine Richtungsänderung ist, die zu einer Kollision führt würde das so nicht funktionieren. Also der Bot bewegt sich in gerader Linie an dem Spieler vorbei und der Spieler geht auf ihn zu nur gerade exact neben dem Spieler entscheidet sich der Bot anderst und rennt auf den Spieler zu. Also wie gesagt das mit dem Vorberechnen mach ich schon, schon alleine wegen der Animation, der fließenden Bewegung und der Menge der Daten die sonst nötig wären. Das der Server immer vorrecht hat ist mir auch bewusst. Aber wenn ich den Clienten zurücksetzen will, dann müsste der Client seinen zurückgelegten Weg doch irgendwie speichern. Also ein Feld mit einigen Einträgen und wenn der Spieler aus irgendwelchen Gründen (zb Internetausfall) mal ganz weit in den Bot hineingerannt ist und der gespeicherte Weg nicht auf freies Gelände zurückreicht zufällig davor positionieren. Oder vielleicht reicht es ja schon, die letzte Richtung so lange zurück zu verfolgen bis die Kollision nicht mehr vorliegt. Darüber müsste ich mal ein Buch lesen oder so ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn du freie Bewegungsrichtungen hast, dann würde ich empfehlen den Pfad per Spline / Bezier Kurve berechnen zu lassen. Das wird dann für den Transfer noch billiger, denn dann musst du nur 4 Punkte senden: Anfang, Ende und die 2 zwischenpunkte. Daraus kann dann eine eindeutige Kurve bestimmt werden die bei jedem Client identisch wäre. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group