Autor Beitrag
NemesisoD
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 901



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 550

Win XP Prof.
Mandrake 10.0

D6
BeitragVerfasst: Mi 12.02.03 13:56 
Bekommt jeder Client andere Daten?
NemesisoD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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 :wink: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 563



BeitragVerfasst: 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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 20



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 43



BeitragVerfasst: 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!