Hey,
als "der Neue" werfe ich erstmal ein fröhliches "Hallo" in die Runde
Ich verfolge schon lange das Geschehen hier und habe mich nun endlich auch einmal registriert, da ich ein paar für mich wichtige Fragen habe.
Dann leg ich auch gleich mal los:
Für ein bekanntes Onlinegame (MMPORG) habe ich mir einen Gameserver in C# (er läuft - jedoch noch nicht optimiert - aber nur mit wenigen Spielern) gebastelt. Da der Server jedoch später mindestens 2000-3000 Spieler gleichzeitig bedienen können soll, habe ich nun vor das ganze nach C++ zu portieren. Im Großen und Ganzen sollte das für mich kein Problem darstellen, jedoch hänge ich momentan an der Socketimplementierung. Ich habe schon ein wenig mit Sockets in C++ rumgespielt, jedoch nicht für solch eine Größenordnung.
Mir stellt sich nun die Frage, wie ich es am geschicktesten aufbauen soll.
1. Möglichkeit
Soll ich es mit Threads lösen? Das würde dann aber bedeuten, dass ich pro Client mindestens 2 Threads habe:
-> Wäre das bei rund 2000-6000 Threads dann nicht etwas zu viel? Da würde der Server doch hoffnungslos zugrunde gehen, oder?
2. Möglichkeit
Arbeiten mit select().
Hier könnte dann das Problem bestehen, dass eine Anfrage zu lange braucht, was dann bedeuten würde, dass bei den anderen Spielern auch nichts mehr geht, da alles blockiert wird.
3. Möglichkeit
Eine Kombination aus Threads & select().
Mehrere Sockets werden in einem Thread zusammengefasst. Dies verringert die ANzahl der benötigten Threads, hat aber immer noch das Problem, dass eventuell der Thread blockiert wird, wenn das ganze etwas zu lange dauert.
Eventuell sollte man es dann so machen, dass der Socket, von dem gelesen werden kann in einen neuen Thread ausgelagert wird und der select-Thread auf den nächsten bereitstehenden Socket warten kann.
-> Könnte es durch das ständige starten und beenden von Threads vielleicht zu Performanceeinbußen kommen? Sollte man eventuell ein paar Threads pausiert starten und denen dann einfach den socket übergeben? Wäre das sinnvoller?
4. Möglichkeit
Die ganzen WSA-Methoden (WSAAsyncSelect und was es da alles gibt).
Mit denen kenn ich mich aber absolut nicht aus. Ich habe bisher auch nicht wirklich viel dazu gefunden. Hauptsächlich nur MSDN Artikel.
Eine Sache noch dazu: Wenn ich bin recv() auf Daten warte, ist es mir dann dennoch möglich an den selben Socket daten zu schicken (aus einem anderen Thread z.B.)?
Das waren mal meine anfänglichen Gedanken. Habt ihr vielleicht noch andere Vorschläge oder könntet mal eure Meinung zu meinen Ideen sagen? Vielleicht hat auch schon jemand Erfahrung mit solchen Dingen gemacht.
Eine weitere Frage die mich noch interessieren würde:
Für welches OS würdet ihr mir das Ganze empfehlen? C# war ja bisher für Windows. Mit C++ hätte ich auch die Möglichkeit auf *nix umzusteigen. Kann man da unter umständen noch etwas Performance herauskratzen?
Oder würdest ihr sogar sagen, dass es egal ist, ob C# oder C++ und ich lieber den bisherigen Server optimieren soll? Man ließ unterschiedliches im bezug auf den Geschwindigkeitsvergleich von C++ und C#.
Ich bedanke mich schonmal,
grubi
als "der Neue" werfe ich erstmal ein fröhliches "Hallo" in die Runde

Ich verfolge schon lange das Geschehen hier und habe mich nun endlich auch einmal registriert, da ich ein paar für mich wichtige Fragen habe.
Dann leg ich auch gleich mal los:
Für ein bekanntes Onlinegame (MMPORG) habe ich mir einen Gameserver in C# (er läuft - jedoch noch nicht optimiert - aber nur mit wenigen Spielern) gebastelt. Da der Server jedoch später mindestens 2000-3000 Spieler gleichzeitig bedienen können soll, habe ich nun vor das ganze nach C++ zu portieren. Im Großen und Ganzen sollte das für mich kein Problem darstellen, jedoch hänge ich momentan an der Socketimplementierung. Ich habe schon ein wenig mit Sockets in C++ rumgespielt, jedoch nicht für solch eine Größenordnung.
Mir stellt sich nun die Frage, wie ich es am geschicktesten aufbauen soll.
1. Möglichkeit
Soll ich es mit Threads lösen? Das würde dann aber bedeuten, dass ich pro Client mindestens 2 Threads habe:
- Thread: Abarbeiten der Aufgaben, die für den einzelnen Spieler anstehen, wie z.B. HP/MP (Health-/Manapoints) automatisch auffüllen
- Thread: recv()
-> Wäre das bei rund 2000-6000 Threads dann nicht etwas zu viel? Da würde der Server doch hoffnungslos zugrunde gehen, oder?
2. Möglichkeit
Arbeiten mit select().
Hier könnte dann das Problem bestehen, dass eine Anfrage zu lange braucht, was dann bedeuten würde, dass bei den anderen Spielern auch nichts mehr geht, da alles blockiert wird.
3. Möglichkeit
Eine Kombination aus Threads & select().
Mehrere Sockets werden in einem Thread zusammengefasst. Dies verringert die ANzahl der benötigten Threads, hat aber immer noch das Problem, dass eventuell der Thread blockiert wird, wenn das ganze etwas zu lange dauert.
Eventuell sollte man es dann so machen, dass der Socket, von dem gelesen werden kann in einen neuen Thread ausgelagert wird und der select-Thread auf den nächsten bereitstehenden Socket warten kann.
-> Könnte es durch das ständige starten und beenden von Threads vielleicht zu Performanceeinbußen kommen? Sollte man eventuell ein paar Threads pausiert starten und denen dann einfach den socket übergeben? Wäre das sinnvoller?
4. Möglichkeit
Die ganzen WSA-Methoden (WSAAsyncSelect und was es da alles gibt).
Mit denen kenn ich mich aber absolut nicht aus. Ich habe bisher auch nicht wirklich viel dazu gefunden. Hauptsächlich nur MSDN Artikel.
Eine Sache noch dazu: Wenn ich bin recv() auf Daten warte, ist es mir dann dennoch möglich an den selben Socket daten zu schicken (aus einem anderen Thread z.B.)?
Das waren mal meine anfänglichen Gedanken. Habt ihr vielleicht noch andere Vorschläge oder könntet mal eure Meinung zu meinen Ideen sagen? Vielleicht hat auch schon jemand Erfahrung mit solchen Dingen gemacht.
Eine weitere Frage die mich noch interessieren würde:
Für welches OS würdet ihr mir das Ganze empfehlen? C# war ja bisher für Windows. Mit C++ hätte ich auch die Möglichkeit auf *nix umzusteigen. Kann man da unter umständen noch etwas Performance herauskratzen?
Oder würdest ihr sogar sagen, dass es egal ist, ob C# oder C++ und ich lieber den bisherigen Server optimieren soll? Man ließ unterschiedliches im bezug auf den Geschwindigkeitsvergleich von C++ und C#.
Ich bedanke mich schonmal,
grubi
Zuletzt bearbeitet: