|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Faller Junior JLI'ler
Alter: 37 Anmeldedatum: 30.11.2006 Beiträge: 88 Wohnort: Dresden Medaillen: Keine
|
Verfasst am: 31.12.2006, 11:39 Titel: Probleme mit recv beim Server |
|
|
ich habe ein simples Server Cleint sistem gebaut.
Wenn ich einfache daten schicke funktioniert es recht gut.
Nun habe ich den Cleint aber in mein Spiel eingebaut und der cleint soll bei jeder bewegung (was fast jeder frame ist) Daten an den Server senden.
Der cleint sendet auch die richtigen Daten ab, aber beim Server kommen mehrer senden Befehle in einem recv an was zum abstürzen des Servers führt.
Ich habe nun hier im Forum nach servern gesucht,und dabei sind folgende Sachen zu tage gekommen erstens ich solte immer senden in jedem frame meines Spieles (was auch zur überlastung führt) und denn eingang "timen" also alles zur selben Zeit machen bei allen Cleints ich suche nun nach Beispielen die sowas schon nutzen tutorials code oder andern hilfen um ein ordentlichen Server zu bauen.
folgende sachen soll mein server beachten
er soll über das internet laufen
es sollen mehrer Cleints möglich seien(ich nutze derzeitig 100)
Ich übergebe derzeitig an den server miene x,y,z Werte (gibt es hier bessere Möglichkeiten)
solte jemand schonmal so ein System gebaut genutzt haben wäre ich wür jede Hilfe dankbar _________________ versuche alles nur wann und wie ist die frage |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 31.12.2006, 13:00 Titel: |
|
|
Das ganze ist ein klein wenig komplexer, fürchte ich.
ich habe selber nicht so richitg viel Ahnung, aber ich sag einfach mal was mir spontan dazu einfällt:
Es ist wichitg, das sowohl der Server, als auch jeder einzelne Client die empfangenen Nachrichten schneller verarbeiten kann, als sei eintreffen.
Man kann natürlcih am Anfang einer Frame alle eingegangenen Nachrichten bearbeiten, aber stell dir einen Server vor, mit 100 Clienten, die alle ca. 60 Frames haben. Kann der Server nur 500 Nachrichten in der Sekunde bearbeiten, mahct er gar nichts mehr, da er in einer endlosschleife ist und nie Daten sendet, sondern alle empfangenen bearbeitet.
Du musst aber alle Nahchrichten so schnell wie möglich bearbeiten, sonst addiert sich das auf und du bearbeitest am Ende 5 Sekunden alte Nachrichten. Die Zeitverschiebung wird imemr größer, kurz das ganze ist unspielbar.
Natürlcih könnte auch der Server mit wenig Clienten das Spiel so oft mit neuen Daten versorgen, dass diese gar nicht mehr dazu kommen ihre Grafiken zu berechnen, wieder das selbe Problem.
D.h. sowohl Server als auch Client muss wohl ab und zu auch eine Bestätigung habne, das alles verarbeitet werden konnte, und dann erst weiter schicken.
Oder du musst ri halbwegs sicher sein, das die sonstigen Berechnungen viel länger dauern, als die Nachrichten zu verarbeiten. D.h. der Server braucht auch ne Framgrenze, und die Spieler dürfen nicht in jedme Frame ihre nachrichten verschicken.
So, dann musst du dir noch überlegen, wie das Spiel laufen soll. Ob es z.b. komplett am Server läuft, und der bekomtm nur die Tastaturcommandos und sendet dann jede Frame den kompleten Spielablauf, oder ob alles von den Clienten berechnet wird.
Du musst mit dem Netzwerktraffic am besten sparsam umgehen, sonst kann obiges leicht passieren oder du hast Lags und wer weiß was sonst noch.
Man kann auch z.b. bestimmte vorhersagen machen, also, von einem Speiler die Position und die Geschwindigkeit übergeben, damit der Client das die nächsten Millisekunden weiterrechnen kann und diese Daten dann nur jede 1/10 Sekunde aktualisieren.
Wie warhscheinlich deutlich geworden ist, ist das ganze nicht so sehr einfach. vor allen Dingen kannd as debuggen sehr schwer werden, wenn z.b. mehr Nachrichten eintreffen als verarbeitete werden können.
Ohne ein gescheites Konzept, ist es dann fast unmöglich irgendwelche Fehelr da zu finden, also sollte man damit anfangen.
Wie gesagt, so super viel Erfahrung hab ich damit nicht, trotzdem müsste das mehr oder weniger stimmen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 31.12.2006, 13:07 Titel: |
|
|
Faller hat Folgendes geschrieben: |
Der cleint sendet auch die richtigen Daten ab, aber beim Server kommen mehrer senden Befehle in einem recv an was zum abstürzen des Servers führt.
|
Welches Protokoll verwendest du`? UDP/IP oder TCP/IP?
Versuch mal den Teil zu beschreiben der für die Verarbeitung verantwortlich ist (am besten mit Code) sonst wird dir das pauschal keiner sagen können.
Solltest du mit Threads arbeiten könnte der Fehler auch daher kommen. Bei TCP/IP solltest du keine Probleme bekommen wenn du mit 'select' arbeitest. Bei UDP (was für Positinsangaben am sinnvollsten sein dürfte) kommen die Datenpaktete so an wie sie gesendet werden (abgesehen von der Reihefolge, bzw. gar nicht) allerdings sollten sie nicht zu groß sein da sie sonst eventuell nicht verarbeitet werden (bsp. alter Router).
Aufbauen würde ich ein Paket in etwa so:
[1 Byte Befehle/Aktion] [1 Byte SpielerID]
darauf aufbauend können dann noch Daten angehangen werden. Z.B. Bewegung:
[4 Byte x Pos] [4 Byte y Pos] [4 Byte z Pos] [4 Byte x Richtung] [4 Byte y Richtung] [4 Byte z Richtung] [8 Byte Timecode]
-> 34 Byes gesammt bei Bewegung.
Eventuell wäre es besser wenn du nicht jedes Frame die Position sendest sondern nur einmal pro Sekunde. Bei Richtungsänderung könntest du ein Paket mit obigen Aufbau senden. Daraus kann dann jeder Client die weiteren Positionen selbst berechnen. Die Geschwindigkeit kannst du ja in den Richtungsvektor einbauen (Einheitsvektor in die entsprechende Richtung * Geschwindigkeit pro Einheit) |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 31.12.2006, 13:30 Titel: |
|
|
Ich warmit meinem letzten Post mal wieder zu langsam
Jonathan hat es eigentlich auf den Punkt gebracht.
Folgendes kannst du ja in deine Überlegungen mit einbeziehen ob du mehr auf dem Server oder auf dem Client arbeitst:
Berechnungen überwiegend auf dem Server:
Vorteile
---------
- Geringe Angriffsmöglichkeit für Hacker
- Das Spiel läuft mit großer Sicherheit einheitlich
- Alle Clients werden entlastet
Nachteile
----------
- Hoher Traffic
- Leistungsstarker Server erforderlich
Berechnung überwiegend auf dem Client:
Vorteile
---------
- Geringer Traffic
- Der Server muss nicht so leistungsstark sein
- Die Genauigkeit der Berechnungen kann von CLient abhängig gemacht werden
Nachteile
-----------
- Hacker haben viele Möglichkeiten falsche Daten an den Server zu schicken
- Das Spiel muss aufwändig synchronisiert werden
Natürlich ist das nicht alles und der Vorteil des einen Verfahrens ist der Nachteil des anderen. Aber es sollte wohl reichen um sich Gedanken darüber zu machen was für das eigene Spiel das Beste ist.
Pauschal kann man eh nichts sagen da es vom Spielprinziep abhängig ist was am besten geeignet ist.
Bei schnellen Spielen würde ich Positionsdaten (die verloren gehen können) per UDP senden und die wichtigen Daten (die ankommen müssen) per TCP senden.
Genauso würde ich Positinsberechnungen auf dem Client vornehmen und Schadenspunkte vom Server berechnen lassen.
Aber das ist jetzt mehr an einen Shooter orientiert, bei einem anderen Spielkonzept wäre das unter umständen Schwachsinnig. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 31.12.2006, 13:41 Titel: |
|
|
Jop, ich würde eine Mischung empfehlen: Das alelrmeiste wird am Cleintenberechnet, aber in einigen Abständne, z.b. 1 Skeunde schick der Server alle seine Spieldaten, so dass rundungs oder Berechnungsungenauigketien am Clienten wieder glattgebügelt werden.
Wenn man so etwas nicht macht, sondern alles am Clienten berechnet, kanns im schlimmsten Fall zum völligen Synchronisationsverlsut kommen.
Am besten wäre es, dass alles am Server läuft und jede Frame an alle Spieler geschickt wird, aber das wird man sich im seltesten Fall leisten können. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Faller Junior JLI'ler
Alter: 37 Anmeldedatum: 30.11.2006 Beiträge: 88 Wohnort: Dresden Medaillen: Keine
|
Verfasst am: 31.12.2006, 15:39 Titel: |
|
|
danke erstma weis ich jetze das es so net funst wie ich mir das gedacht habe
das spiel was ich versuche zu programmiren soll ein Online Rollenspiel mal werden (natürlich kanz einfach).
Mein derzeitiges Server funktioniert auf www.c-worker.ch deisem Tutorial ich würde gerne das mein neuer Server System das ich mir schreiben möchte aller einer halben Sekunde die Positionen und den Zustand des Spielers übergibt. Der Server solte dann diese neuen Daten an die anderen weitergeben.
Da das so komplex ist wolte ich fragen ob jemand schonmal so eine System gebaut hat. Wenn ja wäre es bestimmt interresant dazu mal ein Tutorial zu bekommen. Oder wenn möglich man sich das desen Projekt mal anzuschauen.
Was wür andere Möglichkeiten gibt es denn daten über das internet zu versenden.
da das warscheinlich der letzte post wird hier drinne allen ein gutes neues Jahr und noch schöne Feiertage _________________ versuche alles nur wann und wie ist die frage |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 31.12.2006, 16:11 Titel: |
|
|
Wo ist dein Problem? Wenn du alle Tuts von der Seite gelesen hast solltest du doch alles wissen was du brauchst.
Ist es denn wirklich notwendig genau jede halbe Sekunde die Daten zu verschicken? Eigentlich musst du das ja nur machen wenn sich etwas ändert. Da du ein RPG machen willst kannst du dir sogar den Luxus leisten und TCP/IP verwenden. Da alles per Klick und Werteberechnung funktioniert sind 100%ige Positionsangabe nicht notwendig
Schau dir mal das Beispiel über 'select' an. Da steht genau erklärt wie man mit mehreren Verbindungen arbeiten kann.
Die Daten würde ich nach dem Prinziep verschicken { Befehl/Aktion, IdSpieler , für den Befehl notwendige Daten}
Die Pakete kannst du dann recht gut aufbauen, denn du weißt welche Daten bei welchem Befehl gesendet werden (also menge und Reihenfolge). Solltest du jetzt nicht wissen wie du die in ein char Array rein und wieder raus bekommst schau dir mal 'union' an (GOOGEL suchen).
Du kannst ja einfach erstaml alle ankommenden Daten lesen und den ersten Wert auwerten. Wenn dieser dann die Id der Aktion beinhaltet kannst du einfach per switch/case an die richtige Stelle springen und die Restdaten verarbeiten.
Bsp Spieler Bewegung
CPP: | ...
// ID des Befehls auslesen
short command = ReadCommand(empfangeneDaten);
// Befehlsunterscheidung
switch(command)
{
case 13: // Bewegung eines Spielers
{
// Id des Senders auslesen
// muss nicht in einer Funktion sein
short playerId = getPlayerId(empfangeneDaten);
// hier vieleicht für den Server relevante Sachen erledigen
...
// an alle anderen Spieler senden
for(short player = 0; player < _Players.Length(); player++)
{
// den eigentlichen Sender überspringen
if(_Players[player].Id != playerId)
{
// Hier vieleicht den Befehl durch einen Serverbefehl ersetzen
// oder auch nicht ;)
...
// Daten an den Spieler senden
// empfangeneDaten wure modifiziert oder auch nicht
sendMessage(empfangeDaten,_Players[player].Socket);
}
}
// Nicht den Rest der Caseblöcke ausführen
break;
}
}
|
So in etwa könnte es aussehen. Beachte das es hier reiner Pseudocode ist und nur wie C++ aussieht |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 31.12.2006, 16:21 Titel: |
|
|
raknetist eine Bibliothek, die das netzwerkleben erleichtern kann. Ich habe selber keinerlei Ahnung, aber ich denke, wenn du nicht alles selber amchen willst, könnte das ein Anhaltspunkt sein. Mit der Lizens musste halt ein wenig aufpassen, aber für Freeware oder privaten gebraucht müsste die sogar kostenlos sein.
http://www.rakkarsoft.com/
Viel Spaß
(Netzwerk ist so oder so sehr schwer aber wenn du umbedingt willst, dann vrusch dein Glück. Schwer bedeutet nicht unmöglich, also los!) _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 01.01.2007, 19:14 Titel: |
|
|
Chriss hat Folgendes geschrieben: |
Genauso würde ich Positinsberechnungen auf dem Client vornehmen und Schadenspunkte vom Server berechnen lassen. |
So hab ich das gemacht, nur, dass auch dieSchadenspunkte vom Client berechnet wird. Der Server ist dann quasi nur eine Art Archiv, in dem "nur" die Daten der Clienten gesammelt werden und allen mitgeteilt wird. Das hat bis jetzt noch recht gut funktioniert. Die Verbindung mach ich mit TCP/IP und brauche daher für jeden Mitspieler einen eigene Thread. Der wo den Server startet bekommt ebenfalls eine Client-Verbindung mit dem Server über die IP 127.0.0.1. |
|
Nach oben |
|
|
sp3cK-r0LL3 Senior JLI'ler
Alter: 34 Anmeldedatum: 18.06.2004 Beiträge: 275
Medaillen: Keine
|
Verfasst am: 01.01.2007, 22:27 Titel: |
|
|
übrigens wird z.B. bei 3d-shootern viel interpoliert, z.B. bei Quake3; man kann sich die config so umschreiben, dass man die Gegner sogar noch hinter einer Mauer treffen kann, dank client-seitiger Interpolation _________________ sex is updatedb; locate; talk; date; cd; strip; look; touch; finger; unzip; uptime; gawk; head; apt-get install condom; mount; fsck; gasp; more; yes; more; umount; apt-get remove --purge condom; make clean; sleep |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|