Ist C # für einen Echtzeit-Spieleserver geeignet? [geschlossen]

22

Der größte Teil der Frage steht im Titel.

Grundsätzlich beginne ich mit der Entwicklung eines 2D-Multiplayer-Actionspiels. Der Client wird (wahrscheinlich) in XNA sein, und ich dachte, ich würde hier fragen, ob es eine gute Idee ist, C # auch für die serverseitige Entwicklung zu verwenden.

Ich denke, die Tatsache, dass die Sprache verwaltet wird, ist kein Problem, da Java sogar in MMO-Spielservern verwendet wird (korrigieren Sie mich, wenn ich mich irre). Gibt es also Gründe, C # für diesen Zweck zu vermeiden? Ich muss schnell und reaktionsschnell sein, über TCP kommunizieren und mit einem SQL-Server chatten können. Und wenn es keinen Grund gibt, C # zu vermeiden, wie würde ich einen solchen Webserver bereitstellen, wäre es eine .NET-EXE, die auf dem Servercomputer ausgeführt wird?

Zaky Deutsch
quelle
2
Sie sind in Bezug auf den Java MMO-Server korrekt .
Ricket

Antworten:

22

Nach meiner Erfahrung nicht nur tragfähig, sondern auch sehr gut. Ich habe mehrere MMO-Server mit C # entwickelt und muss sagen, dass ich die Wahl der Sprache und Plattform nie bereut habe.

Es gibt viele großartige Bibliotheken und Tools für C # und .NET im Allgemeinen - Netzwerk, Protokollierung, O / R-Zuordnung usw. Und im Vergleich zu Java ist C # aussagekräftiger und weniger ausführlich (einige Leute könnten sich jedoch darüber streiten). )

Der GC-Overhead, der einigen Leuten Angst macht, ist kein wirkliches Problem, es sei denn, Sie missbrauchen ihn mit Milliarden von Zuweisungen pro Sekunde. Beispielsweise weist unser aktueller Server unter hoher Last bis zu 50 MBit / s zu, und GC führt zu keiner merklichen Verzögerung. Wir mussten jedoch an strategischen Stellen das Objekt-Pooling verwenden - am wichtigsten ist, dass Objekte, die Netzwerkpakete darstellen, gepoolt und nicht mit Müll gesammelt werden. Auch wenn das Pooling deaktiviert ist, ist GC nicht das größte Problem.

Als Beispiel dafür, wie cool C # ist, haben wir dies kürzlich implementiert. Auf unserem Server werden mehrere WCF-Dienste ausgeführt, die der Spielclient für nicht zeitkritische Aufgaben verwendet, und wir verwenden sie auch für die Serververwaltung. Es stellt sich heraus, dass es sehr einfach ist, einen WCF-Dienst zu erstellen, um unsere Spielobjekte einfach an den Anrufer zurückzugeben. Also haben wir genau das getan und dann ein kleines Plugin für LINQPad erstellt, das eine Verbindung zu unserem Server herstellt - und jetzt können wir Abfragen wie ausführen

from character in Service.GetOnlineCharacters()
where character.LocationManager.LocationId==5 && character.Attributes.Level<10
select new { character.Id, character.Nick }

Auf einem Live-Server nicht weniger! Ich glaube nicht, dass Sie dies mit einer anderen Plattform tun können. Zumindest nicht in der Arbeit eines Paares.

Keine Ursache
quelle
Mir gefällt vor allem die Verwendung von LINQ, das macht den Server so viel einfacher und schneller zu entwickeln.
Thomas
26

Natürlich können Sie C # verwenden.

Eines der größeren Probleme, die in Bezug auf die Leistung in C # oder anderen .NET-Ökosystemen zu beachten sind, ist der GC. Das .NET-Framework bietet verschiedene GC-Varianten , einschließlich eines "Server" -GC, über die es sich zu informieren lohnt. Die intelligente Verwaltung des Speichers (z. B. durch Pooling) ist auch in einer verwalteten Umgebung eine gute Technik.

Es gibt mehrere robuste APIs für die Interaktion mit SQL, für die Kommunikation über TCP usw. in C #, entweder als Teil des Basisframeworks oder über Drittanbieter, sodass Sie dort keine Probleme haben sollten.

Sie können ASP.NET oder ähnliches verwenden, wenn Ihr Server wirklich webbasiert sein soll. Wenn Sie nur einen Prozess ausführen und auf TCP-Verbindungen warten möchten, können Sie einfach eine EXE-Datei und die entsprechenden Abhängigkeiten für den Servercomputer bereitstellen, die entsprechenden Ports öffnen und die EXE-Datei ausführen.

Josh
quelle
5

Ich denke, das ist eine großartige Idee. Die Sprache ist mit Sicherheit in der Lage, und vor allem, wenn Sie es wissen, verbringen Sie keine Zeit damit, eine neue Sprache zu lernen, nur weil sie "schneller" ist. Der wahre Engpass Ihres Servers ist die Netzwerklatenz. Ein oder zwei zusätzliche Millisekunden, weil Sie C # anstelle von C ++ verwendet haben, machen keinen Unterschied.

Ricket
quelle
5
Das reale Risiko der Spieleentwicklung (oder jeder Echtzeitentwicklung) in verwalteten Sprachen besteht nicht darin, dass alles eine oder zwei Millisekunden länger dauert, sondern dass zufällige Frames mehrere zehn Millisekunden länger dauern, weil der GC beschlossen hat, die Dinge fertigzustellen. Durchsatzorientierte Vergleiche mit Begriffen wie "Engpass" zu fördern, ist irreführend.
3

Wenn es für Sie in Ordnung ist, unter Windows bereitzustellen, würde ich es nachdrücklich empfehlen, zumal Ihr Client C # ist.

Unterschätzen Sie jedoch nicht die Entwicklung von Spielservern. Selbst das Erstellen eines einfachen Nur-Chat-Servers ist keine triviale Aufgabe, und Sie werden bald viele Fragen zu Parallelität, Sperren, Leistung usw. haben.

Als Ausgangspunkt möchten wir Sie bitten, sich diese Seite anzusehen, auf der ausführlich erklärt wird, wie die gleichzeitige Socket-Programmierung auf mehreren Plattformen durchgeführt wird:

http://geekswithblogs.net/quension/archive/2006/06/30/83760.aspx

Wenn Sie es wirklich ernst meinen, empfehle ich Ihnen, Stevens 'Unix-Netzwerkprogrammierung gründlich zu studieren. Es konzentriert sich auf C-Sockets unter Unix, aber die Prinzipien sind für alle anderen Plattformen, einschließlich .net, gleich.

Bearbeiten: Dies ist eine weitere großartige Ressource, die sich auf Skalierbarkeit und Leistung für gleichzeitige Server in .net konzentriert. Es ist nicht mehr verfügbar, aber unsere Freunde am Rückwegautomaten haben eine Kopie davon.

http://replay.waybackmachine.org/20080405220143/http://www.coversant.net/dotnetnuke/Coversant/Blogs/tabid/88/EntryID/10/Default.aspx


quelle
1

Ein "Nachteil" wäre, dass Sie bei C #, wenn Sie es auf mehreren Plattformen verwenden möchten, sehr vorsichtig sein müssen, um sicherzustellen, dass Ihr Code mit Mono funktioniert. Wenn Sie es nur auf einer einzigen Plattform ausführen möchten und Windows diese Plattform ist, sollten Sie keine Probleme haben, wie andere bereits erwähnt haben.

Kyle C
quelle
Vergessen Sie nicht, dass MONO für die Bereitstellung auf anderen Plattformen verwendet werden kann. Ich glaube, Second Life verwendet diesen Ansatz - ihre internen Spieleskripte sind tatsächlich zu .NET IL kompiliert, sie werden jedoch auf Linux AFAIK bereitgestellt.
ShadowChaser