| Autor |
Beitrag |
NemesisoD
      
Beiträge: 43
|
Verfasst: Di 11.02.03 20:51
Hi Leute,
Ich habe folgendes Problem:
Ich schreibe ein Spiel das sowohl über Netzwerk als auch über Internet gespielt werden kann. Jeder Spieler kann mit der richtigen Software von überall am Spiel teilnehmen, und die Spielerzahl soll nicht begrenzt sein, aber wie kann ich jetzt mehreren Spielern gleichzeitig Ihre Daten schicken ohne das der Spielverlauf durch Zeitverzögerungen beeinträchtigt ist.
Kann man nicht z.B. unbegrenzt Server und Clienten wärend der Laufzeit erstellen, so das wenn sich ein Spieler anmeldet diesen direkt ein Server und Client erstellt wird!
Wäre dies möglich? Und wenn ja wie!
_________________ Wer nicht programmiert, der lebt nicht!
|
|
O'rallY
      
Beiträge: 563
|
Verfasst: Di 11.02.03 21:01
Ich kann dir nicht sagen, wie es funktioniert, aber auf jedenfall ist die Idee mit den zur Laufzeit erzeugten Clients und Servern eine schlechte Idee. Die Performance währe im Keller und alle Resourcen währen aufgebraucht, also das Gegenteil von dem was du dir vorstellst.
Ich würde das ganze mit UDP machen. Die Clients schicken dem Server ihre Tabellen und der Server schickt diese wiederrum an alle Clients. UDP, da es sehr schnell ist. Und man kann bei einem Spiel auch mal ein verlorenes Packet verkraften.
Anders kan ich es mir nicht vorstellen, wie es effizent funktionieren sollte.
_________________ .oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Di 11.02.03 21:09
Aber wenn jetzt ca. 20 User auf den Server zugreifen, würde das dann nicht das Netzwerk überlasten? Weil der Server müsste alle 2-5min allen Spielern neue Daten senden!
_________________ Wer nicht programmiert, der lebt nicht!
|
|
BungeeBug
      
Beiträge: 901
|
Verfasst: Di 11.02.03 21:50
na also wenns nur alle 2-5 minuten sind kannste das ganze auich per Post erledigen ... ne jetzt mal ernst ... 2-5 Minuten und 20 Clients is keine herausvorderung für kein Netzwerk ... da kannst du auch TCP/IP nehmen, da haste dann auch ne empfangskontrolle und was noch alles mehr ...
MfG BungeeBug
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Di 11.02.03 23:08
Das war nur ein beispiel, es sollen ja soviele wie es geht rein können, das können auch 200 werden oder noch mehr!!!
Kann mir den das einer sagen wie ich das dann programmieren muss,
weil bei mir hat der bei zwei Clienten schon zeitverzögerungen!
Erst bekomt der eine seine Dtaen und 20-30 sek später erst der andere, und wenn ich mir das bei noch mehr Rechnern vorstelle, dann bekommt der eine gerade mal seine Daten, da ist der andere schon ne Runde weiter!!!
Also, wenn mir einer sagen kann wie ich das am besten Programmieren kann, bitte meldet euch!!!
*verzweifel*
_________________ Wer nicht programmiert, der lebt nicht!
|
|
Ex0rzist
      
Beiträge: 550
Win XP Prof. Mandrake 10.0
D6
|
Verfasst: Mi 12.02.03 13:56
Bekommt jeder Client andere Daten?
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Mi 12.02.03 16:10
Jeder der Clienten soll die Allgemeinen Daten (wie z.B. welche runde ist gerade, hat sich ein neuer Spieler angemeldet usw.) bekommen und wenn ein Ereigniss Ihne direkt betrift soll er darüber auch informiert werden!!!
_________________ Wer nicht programmiert, der lebt nicht!
|
|
O'rallY
      
Beiträge: 563
|
Verfasst: Mi 12.02.03 17:00
Wie schon gesagt: Benutze UDP. Die allgeimeinen Daten, also die Daten, die jeder Spieler erhält, würde ich mittels Broadcast verschicken. Die anderen musst du halt normal verschicken.
_________________ .oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Mi 12.02.03 18:32
Aber habe ich bei UDP nicht die gefahr das ich einige Pakets nicht erhalte?
Wäre TCP nicht besser?
Und warum funktioniert das im Internet auch?
Da gibt es auch Spiele wo sich mehrere tausend User anmelden und da haben die kein Problem mit den ganzen Netzwerk!!!
_________________ Wer nicht programmiert, der lebt nicht!
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Mi 12.02.03 19:16
lol* die haben auch richtig dicke server, und davon hunderte.
Also. ich habs auch noch nicht gemacht, aber ich weiss, dass es meistens mit UDP gemacht wird, bzw. via DirectPlay (glaub ich ist auch UDP?). Kannst ja mal nach einer guten DirectPlay unit suchen.
Ich denke man sollte den nachriten prioritäten zuweisen, damit der server weiss welche er schnell verarbeiten muss (zB ein schuss ist wichtiger als ein chattext).
Und der server muss, glaube ich, thread basiert sein (also asyncron)!?
viel spass
|
|
O'rallY
      
Beiträge: 563
|
Verfasst: Mi 12.02.03 20:20
Natürlich besteht die Möglichkeit, dass bei UDP Packete verloren gehen können. Dies erwähnte ich ja schon. Doch ist die wahrscheinlichkeit nicht allzugroß und wenn mal ein Packet nicht ankommt, muss es nicht direkt schlimme Konsequenzen haben. Es lagt halt n bissl. Kommt natürlich auf die Art des Spiels an.
Worum geht 's in dem Spiel überhaupt?
_________________ .oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Mi 12.02.03 22:02
Es soll ein Rundenbasierendes Weltraum spiel werden, wie z.B. Dark Galaxy oder Galaxy Wars!
Mit den Chattext hatte ich mir eh gedacht das der Client nur die IP des chatparners anfordert und dann sich direkt mit Ihm verbindet!
Oder so ähnlich!
Kann mir denn mal einer ein paar Infos geben wie ich mit UDP umgeh, weil ich hab noch nicht all zuviel mit Netzwerken am Hut gehabt!
_________________ Wer nicht programmiert, der lebt nicht!
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Do 13.02.03 17:38
| Zitat: | Mit den Chattext hatte ich mir eh gedacht das der Client nur die IP des chatparners anfordert und dann sich direkt mit Ihm verbindet!
Oder so ähnlich! |
Das ist eigentlich unüblich, da der andere rechner somit seine anonymität einbüsst  und du musst in dein spiel client einen 'server' einbauen, der die verbindung entgegen nimmt. Geht aber natürlich...doch was ist wenn man zB im team spielt und die message an alle soll. Da würd ich doch lieber über den server gehn, er sowieso schon die verteiler funktionen drinn hat.
mfg mx.
|
|
O'rallY
      
Beiträge: 563
|
Verfasst: Do 13.02.03 19:59
Um UPD zu nutzen, würd' ich dir die Indy-Kompos vorschlagen ([url] www.indyproject.org[/url]). Das sind TIdUPDClient u. TIdUPDServer. Der Umgang ist recht einfach. Ein Beispiel:
IdUDPServer1 Einstellungen:
- Active: true
- DefaultPort: z.B. 1234
- Falls du Broadcast benutzen willst: BroadcastEnabled: true
IdUDPClient1 Einstellungen:
- Port: z.B. 1234
- Falls du Broadcast benutzen willst: BroadcastEnabled: true
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var RecText: string; begin SetLength(RecText, AData.Size); AData.ReadBuffer(PChar(RecText)^, AData.Size); ShowMessage(ABinding.PeerIP + ' hat "' + RecText + '" gesendet.'); end;
procedure TForm1.Button1Click(Sender: TObject); begin IdUDPClient1.Active := true; IdUDPClient1.Send('Hello World!'); IdUDPClient1.Broadcast('Ich bin ein Broadcast!', 1234); // hier muss auch der Port angegeben werden IdUDPClient1.Active := false; end; |
_________________ .oO'rallY
Linux is like a tipi: No gates, no windows and a gnu-eating apache inside...
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Do 13.02.03 22:56
Ich danke euch schon mal allen,
Ihr habt nur sehr geholfen, und wenn ich noch ein paar Probleme haben sollte, dann kann ich mich ja an euch richten!!!
_________________ Wer nicht programmiert, der lebt nicht!
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Do 13.02.03 23:24
Eine Frage hab ich noch:
Wäre es vielleicht besser mehrere UDP Protokolle zu nutzen,
z.B. eins für die anmeldung läuft über Port 5000, ein zweites für Truppen bewegung über 5001 usw.!
Weil damit könnte ich doch beim Server das eine Protokoll stark entlasten, oder nicht?
_________________ Wer nicht programmiert, der lebt nicht!
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Fr 14.02.03 11:41
Jo,
die idee ist garnicht so schlecht. Normalerweise macht man generell bei solchen spielen einen standart port für anmeldung und handelt dann dynamisch eine port-nummer aus! Hat halt den vorteil, dass wenn prots belegt sind, man einen anderen nehmen kann, weils es dann alles flexible ist.
mfgmx.
|
|
Sharky
      
Beiträge: 20
|
Verfasst: Fr 14.02.03 13:40
Hai,
Ich habe da mal eine alles entscheidende Frage:
Von welcher Datenmenge reden wir? Wenn jeder Client immer nur 10 - 50 Byte sendet und empfängt ist es ja auch bei 200 Clients nicht viel.
Wenn aber jeder Client 10 kByte sendet bekommst Du natürlich probleme!
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Fr 14.02.03 14:13
Also,
ich sende immer nur Texte wobei die texte immer einen anfangs Code haben, dieser sagt den Clienten was er mit den folgenden Daten machen muss, und einen End Code der sagt ihn, das er auf neue Daten warten soll, aber die Texte sind nucht lang! Aber um was für eine Daten menge es sich jetzt handelt weiß ich nicht, dürfte aber nicht groß sein!
_________________ Wer nicht programmiert, der lebt nicht!
|
|
NemesisoD 
      
Beiträge: 43
|
Verfasst: Sa 15.02.03 00:07
Der Quellcode den ihr mir für UDP gegeben habt, der funktioniert nicht wirklich, es wird immer gesagt das TIdSocketHandle ein Unidetifizierter Bezeichner ist!
Was muss ich jetzt tun?
_________________ Wer nicht programmiert, der lebt nicht!
|
|