mmofacts.com

MMBG Serversoftware

gepostet vor 14 Jahre von silentiumest

Hallo,

ich plane gerade ein Echtzeit-MMBG (soll heißen Massive Multiplayer Browser Game).

Als Client wird Silverlight eingesetzt. Als Server eingesetzt werden soll

a) Eine WCF-Dienstanwendung

b) Ein Socket-Server auf Linux basierend in C++

Hat schon jemand Erfahrung mit WCF gemacht? Hält Windows die Last von mehreren tausend Spielern gleichzeitig aus? Da das ganze auf .NET basiert, denke ich mal, dass es ziemlich lahm sein wird und somit nicht geeignet ist.

Sollte ich mich für den Socket-Server entscheiden, kommt die Frage auf, wie ich die Spieler-Daten (Positionen der Krieger, etc.) speicher. Macht man das in ganz normalen Arrays? Ich habe vor, den Spielstand alle 5 Minuten auf einem externen DB-Server zu speichern, um mich vor Datenverlust zu schützen.

Wisst ihr, wie das andere große Browsergames machen (die hauptsächlich einen Flash-Client haben)? Könnt ihr mir noch andere Tipps geben?

gepostet vor 14 Jahre von Bringer

>Ich habe vor, den Spielstand alle 5 Minuten auf einem externen DB-Server zu speichern, um mich vor Datenverlust zu schützen.

Halte ich persönlich für übertrieben. Selbst ein 30-Min-Takt ist noch ziemlich heavy wenn man nicht unbedingt tausende Euro (grml, wann bekommt ihr das endlich hin, dass hier auch sonderzeichen wie unser geliebter Euro nicht wegretuschiert werden) in kürzester Zeit verlieren könnte.

Beim Payment lass ich mir 5-Min-Takt ja noch eingehen ;)

gepostet vor 14 Jahre von Dhyani

Bei uns laeuft ein C++ Kern. Die Kommunikation zum Frontend erfolgt ueber Sockets. Saemtliche Daten mit Ausnahme der IGMs (von denen der Kern nichts weiss) halten wir im Speicher und schreiben sie alle 12 Minuten als Sicherung verschluesselt auf Platte. Eine Datenbank fuer Spieldaten benoetigen wir daher nicht. Und sind sehr gluecklich darueber.

Dhyani

gepostet vor 14 Jahre von TheUndeadable

 Hält Windows die Last von mehreren tausend Spielern gleichzeitig aus? Da das ganze auf .NET basiert, denke ich mal, dass es ziemlich lahm sein wird und somit nicht geeignet ist.

?!

Windows ist wie Linux ein modernes Betriebssystem und hat ähnliche Lastfähigkeiten.

.Net ist gerade mit .Net 4 an die Geschwindigkeit von nativem Code angekommen. Ich persönlich würde mir wenige Gedanken um Windows und .Net machen. Der einzige Faktor der gegen Windows spricht ist der Kostenfaktor und eventuell Spezialanwendungen, die Linux-Unterstützung benötigen. Oder eventuell einfach die Tatsache, dass dir Linux bekannter, bequemer und evtl sympatischer ist.

Wenn dir WCF zu langsam ist, was es im Regelfall nicht ist, da es hochoptimierte, binäre Objekte ebenfalls unterstützt, kannst du auch immer noch Sockets in .Net implementieren. Aber... Ich behaupte: Ein 'nebenbei' implementiertes Sockethandling wird langsamer sein als WCF zu nutzen, insbesondere wenn du http.sys als Server nutzt.

Leider habe ich selbst zu wenig Ahnung von WCF. Ich nutze es nur beim Brückenbauer (http://brueckenbauer.depon.net). Dort gehen aber nur wenige Requests durch.

Ansonsten nutze ich den HttpListener um mein BG zu implementieren.

Macht man das in ganz normalen Arrays? Ich habe vor, den Spielstand alle 5 Minuten auf einem externen DB-Server zu speichern, um mich vor Datenverlust zu schützen.

Ich persönlich mache es genauso, betreibe momentan allerdings nur ein 10 Mann-BG ;-)

Einen Absturz meiner Serversoftware oder des Servers hatte ich in den letzten 2 Jahren nicht. Insbesondere durch die Verwendung von Managed-Programmiersprachen (.Net/Java) kannst du sehr fehlertolerante Software bauen, die auch im Notfall bei einer unbehandelten Ausnahme/Exception die Daten auf die Platte sichert, bevor sie dann den Dienst beendet.

gepostet vor 14 Jahre von silentiumest

Gibt es noch mehr Leute, die der Meinung sind, dass Windows und .Net stabil und schnell genug dafür sind? Habe schon von anderen gehört, dass .Net für den Bereich völlig sinnlos ist...

@Dhyani: Wie sieht euer Code aus? Speichert ihr die Spielerdaten in Arrays? 

@TheUndeadable: Du hast gesagt, du speicherst die Spielerdaten in Arrays (bzw. Listen) in deiner WCF-Dienstanwendung. Wie sieht dein Code aus? Bei jeder Verbindung wird doch ein neues Objekt angelegt, wie greifen die einzelnen Objekte auf die Arrays zu?

Das 5-Minütige Backup kann man ja dann mal testen. Zur Not kann man das bestimmt auch noch anders machen, das wird aber nicht das Problem sein.

gepostet vor 14 Jahre von TheUndeadable

> Habe schon von anderen gehört, dass .Net für den Bereich völlig sinnlos ist...

ASP.Net würde ich in dem Bereich als sinnlos bezeichnen, .Net selbst eher weniger.

> Wie sieht dein Code aus?

Beim Brückenbauer, bei dem ich WCF nutze, habe ich den SQL Server als Speicherort definiert. Beim FBK (meiner Browsergameengine) nutze ich kein WCF. Dementsprechend kann ich deine Frage nicht beantworten.

Ich speicher die Daten in einem 'Welt-Objekt', das ich als Ganzes auch auf die Platte serialisieren lasse.

http://bitbucket.org/mbrenn/burnsystems.fbk/src/tip/src/BurnSystems.FBK.Modules/Game/World/Data/World.cs

http://bitbucket.org/mbrenn/burnsystems.fbk/src/tip/src/BurnSystems.FBK.Modules/Game/Player/Data/Player.cs

> wie greifen die einzelnen Objekte auf die Arrays zu?

Als einfachste Variante könnte man das Welt-Objekt als statische Variable speichern. Alternativ auch spezielle Manipulator-Objekte statisch zur Verfügung stellen. Nur diese Objekte dürfen an deinem Welt-Objekt arbeiten.

Aber denke an die Threadsicherheit!

gepostet vor 14 Jahre von BBana

Original von silentiumest

Gibt es noch mehr Leute, die der Meinung sind, dass Windows und .Net stabil und schnell genug dafür sind? Habe schon von anderen gehört, dass .Net für den Bereich völlig sinnlos ist...

@Dhyani: Wie sieht euer Code aus? Speichert ihr die Spielerdaten in Arrays? 

@TheUndeadable: Du hast gesagt, du speicherst die Spielerdaten in Arrays (bzw. Listen) in deiner WCF-Dienstanwendung. Wie sieht dein Code aus? Bei jeder Verbindung wird doch ein neues Objekt angelegt, wie greifen die einzelnen Objekte auf die Arrays zu?

Das 5-Minütige Backup kann man ja dann mal testen. Zur Not kann man das bestimmt auch noch anders machen, das wird aber nicht das Problem sein.

Nutze auch C# für einen Socket Server der mit Flash Clients kommuniziert. Vernünftig implementiert (!) ist das sowohl sehr stabil als auch performant. Ein sehr billiger Windows VPS reicht gut um dreistellige Anzahl von gleichzeitig agierenden User zu bedienen. Dito kann ein "voller" Server gut vier- oder fünfstellig Anzahl von Clients bedienen....

Gespeichert wird vieles im RAM in verschiedenen Datenstruckturen je nach Bedarf von Array, Listen, Dicitionarys oder eben eigenen Klassen. Gesichert wird alles was persistent ist in einer SQL DB. 

gepostet vor 13 Jahre, 10 Monate von silentiumest

Ich habe mich jetzt auch in Absprache mit weiteren Fachleuten entschlossen, das ganze mit Microsoft-Lösungen zu machen. Vielen Dank für eure zahlreichen Antworten.

Auf diese Diskussion antworten