Browsergame - wie leistungsstark muss der server sein?

liutasil

New Member
Hallo!

seit fast nem halben Jahr bin ich jetzt schon dabei ein Browsergame zu schreiben. Bis jetzt hat zur Entwicklung ein kostenloser Server gereicht, doch so langsam muss ein richtiger her. Auch, da ich einen externen Datenbankzugriff benötige.
Da das ganze mein erstes Projekt dieser Art ist habe ich keinen Plan was für einen server ich benötige.
Das Browsergame basiert auf php. Das einzige für das evtl. ordentlich Leistung gebraucht wird ist das Kampfsystem. Das wird nämlich Echtzeit und läuft in Form eines Java-Applets über eine Datenbank.
Jeder Kampf benötigt ca. 5-10 Abfragen pro sec.

Reicht für das ganze erstmal ein einfacher VServer mit 300MB RAM?
Oder muss da mehr her?
 
Das Browsergame basiert auf php. Das einzige für das evtl. ordentlich Leistung gebraucht wird ist das Kampfsystem. Das wird nämlich Echtzeit und läuft in Form eines Java-Applets über eine Datenbank.
Jeder Kampf benötigt ca. 5-10 Abfragen pro sec.

Reicht für das ganze erstmal ein einfacher VServer mit 300MB RAM?
300 MB reichen im Prinzip für Webserver und Datenbank.
Bei der Frage, wieviele gleichzeitige Spieler so ein System aushält, würde ich mal schätzen, daß du das an den Fingern einer Hand abzählen kannst ;)
Und auch dann wird der Server ab und zu stottern.

Und das Java-Applet soll auf die Datenbank zugreifen?
Ich glaube, es ist keine gute Idee, den Port der Datenbank freizugeben.

Gruß, Peter
 
Und das Java-Applet soll auf die Datenbank zugreifen?
Ich glaube, es ist keine gute Idee, den Port der Datenbank freizugeben.

anders lassen sich Echtzeit-Kämpfe meines Wissens nach nicht realisieren.
Wenn jemand eine bessere Idee hat, bin ich offen für Vorschläge:D

Bei der Frage, wieviele gleichzeitige Spieler so ein System aushält, würde ich mal schätzen, daß du das an den Fingern einer Hand abzählen kannst
Und auch dann wird der Server ab und zu stottern.

was für ein server ist denn deiner Meinung nach nötig, damit das ganze auch noch bei mittleren Besucherzahlen läuft?
 
anders lassen sich Echtzeit-Kämpfe meines Wissens nach nicht realisieren.
Du willst ernsthaft eine Anwendung direkt auf die DB loslassen?
Das habe ich sicher missverstanden, oder?

Wenn jemand eine bessere Idee hat, bin ich offen für Vorschläge
Ein Server-Prozess, der als Schnittstelle zwischen Client und DB fungiert?
Die Clients machen nur Anzeige und übermitteln Entscheidungen des Spielers an den Server, der die Kampfengine aufsführt.

Beschreib mal bitte ein paar Einzelheiten über das Design der Kommunikation der Komponenten untereinander. Wenn ich oben nicht falsch gelegen habe, willst du das unbedingt nochmal besprechen.

Zu deiner Frage: Das hängt absolut von deiner Anwendung und ihrem Ressourcenverbrauch ab. Wie viel das ist, kannst nur du herausfinden, da sonst keiner das Spiel kennt. Der Ressourcenverbrauch hängt auch sehr stark von genutzem oder ungenutzem Potential für Optimierungen ab. Verpasste Optimierungen oder ungünstiges Design kann da enorme Unterschiede machen.
Deshalb gilt: Deine Frage ist nicht zu beantworten. Nicht mit den verfügbaren Informationen.
 
Last edited by a moderator:
also das ganze war im Prinzip folgendermaßen geplant:
2 Spieler treten gegneinander an. Jeder Spieler hat eine oder mehrere Figuren auf einer Seite stehen. Will man den Gegner angreifen, lässt man von einer seiner Figuren einen Angriff los, der dann auf die Gegenseite "fliegt".
Gleichzeitig wird der Angriff in die db eingetragen, zusammen mit dem Schadenswert.
Bei jedem Spieler wird 5 mal pro sec geprüft, ob laut db ein Angriff auf ihn gestartet wurde. Ist dies der Fall, wird auch bei ihm der Angriff ausgeführt und dann aus der db gelöscht.
so das war die kurzfassung.
Das ganze hätte ich über ein Applet, JDBC und eine Java Game engine gelöst.
Also im Prinzip hatte ich wirklich vor, die Anwendung direkt auf die db loszulassen:D
lässt sich das ganze so nicht realisieren?
 
Bei jedem Spieler wird 5 mal pro sec geprüft, ob laut db ein Angriff auf ihn gestartet wurde. Ist dies der Fall, wird auch bei ihm der Angriff ausgeführt und dann aus der db gelöscht.
Hm, das hört sich wie Polling an; das verschwendet unnötig Ressourcen.
Vielleicht währe es besser, die würdest severseitig die Spielsituation in Java realisieren, und nur dann die Clients benachrichtigen, wenn etwas für sie vorliegt.
Dieses "Benachrichtigen" wird dadurch implementiert, daß jeder Client beim Server nachfragt "hast du was für mich?" und der Server diese Connection so lange offen hält, bis ein Spielzug erfolgt ist.
Den Server kannst du z.B. mit Tomcat realisieren, dann bist du auch das Problem mit dem offenen Datenbank-Port los.
Das Applet kommuniziert dann per HTTP(S) über Port 80/443 mit dem Server.
(Das geht mit Spring-Remoting eigentlich recht elegant).

Tomcat paßt aber in die 300MB nicht mehr rein; 500MB (möglichst realen) Speicher sollte der Server dann doch haben...
Mein Daumen sagt, daß eine solche Architektur auf einem VServer für 10€/Monat etwa gleichzeitige 100 Spieler aushält (kommt auf die Anzahl der Spielzüge/Sekunde an).
 
Wenn es unbedingt Java sein soll, dann ist die Verteilung Client-Server am einfachsten mit Java-RMI zu lösen.
 
Wenn es unbedingt Java sein soll, dann ist die Verteilung Client-Server am einfachsten mit Java-RMI zu lösen.
Ach du Schreck nein!
RMI bitte nur inhouse einsetzen.
Die Konfiguration einer Firewall für RMI kann anstrengend werden.
Und ein Callback will man im Internet nicht wirklich haben.

Für Kommunikation im Internet besser HTTP(S) nehmen.
Der Overhead gegenüber RMI beträgt meiner Erfahrung nach nur ca 5%,
und Verschlüsselung ist kein Thema mehr.
Schau dir das Spring Framework in Bezug auf Remoting an; da kann man bequem zwischen RMI und HTTP umschalten.

Gruß, Peter
 
Wieso?

RMI kümmert sich automatisch um das Tunneling bei Firewalls (HTTP POST) und kann auch Proxys (http.proxyHost) verwenden.
 
also habe ich das jetzt richtig verstanden:
sobald ein Angriff gestartet wird, wird dieser vom client an den server übermittelt. Der Server speichert erstmal alle Angriffe. Jeder client hält dann solange eine Verbindung mit dem server offen, bis ein Angriff auf ihn erfolgt ist. Ist dies der Fall, wird der Angriff vom server gelöscht.
Oder können mehrere Spieler gleichzeitig mit dem server verbunden sein,
sodass die Angriffe einfach direkt an den entsprechenden Spieler "weitergeleitet" werden?
sorry, das sind wahrscheinlich ziemliche Anfängerfragen, aber ich habe noch nie eine server / client application geschrieben

Gibt es keine Möglichkeit, eine direkte Netzwerk-Verbindung zwischen 2 Spielern aufzubauen, ohne einen server "dazwischenzuschalten"?
 
Gibt es keine Möglichkeit, eine direkte Netzwerk-Verbindung zwischen 2 Spielern aufzubauen, ohne einen Server "dazwischenzuschalten"?
Doch, aber dazu brauchst du einen Trick den unter anderem Skype usw benutzen:
Beide Seiten müssen dauernd präparierte Anfragen an die Gegenstelle schicken.
Der Router hält die ankommende Anfrage dann fuer die Antwort auf eine seiner Anfragen und leitet es korrekt weiter.
Allerdings musst du beachten, dass bei P2P keine Möglichkeit besteht um zu kontrollieren dass die Spieler nicht mogeln, und das wäre bei einem bekannteren Spiel fatal.

Ich schließe mich denjenigen an die AJAX vorgeschlagen haben:
Ein Pushing uber AJAX geht in allen Browsern außer IE (wen wunderts?) und bei IE sollten 1-2 Abfragen/Sekunde an den Server locker reichen (mehr Anfragen kriegst bei nicht-optimaler Verbindung eh nicht gut unter)
Flash auf Clientseite ist natürlich auch eine Alternative.
Java würde ich wegen dem hohen Verbrauch des Loaders sowie der geringeren Verbreitung nicht für Clients benutzen (aber auf Serverseite gehts natürlich)

Als ServerSystem aber bei solchen Pushes aber UNBEDINGT lighthttpd (oder ähnlich) einsetzen: Apache mit seinen max 250(?) Verbindungen ist zu schnell am Limit.
 
Last edited by a moderator:
Sry -falsch ausgedrückt.
~250 Forks -und da jeder Fork 1Anfrage gleichzeitig bearbeitet soweit ich mich erinnern kann müssten andere Anfragen warten, was zu einem Teufelskreis an Verzögerungen werden würde...

Ausserdem sollte man den Server für so was genau an die Voraussetzungen des Scripts anpassen, was besser geschieht wenn man die Module aufbaut (lighthttpd) als abbaut (apache) :)
 
~250 Forks -und da jeder Fork 1Anfrage gleichzeitig bearbeitet soweit ich mich erinnern kann müssten andere Anfragen warten, was zu einem Teufelskreis an Verzögerungen werden würde...
Wie gesagt, alles Einstellungssache. Es gibt dafür z. B. ein geeignetes MPM.

Ausserdem sollte man den Server für so was genau an die Voraussetzungen des Scripts anpassen, was besser geschieht wenn man die Module aufbaut (lighthttpd) als abbaut (apache) :)
Also ich mache das sowohl bei lighty, als auch Apache httpd auf die gleiche Art: nur das laden, was benötigt wird.
 
Ich schließe mich denjenigen an die AJAX vorgeschlagen haben:
Ein Pushing uber AJAX geht in allen Browsern außer IE (wen wunderts?) und bei IE sollten 1-2 Abfragen/Sekunde an den Server locker reichen (mehr Anfragen kriegst bei nicht-optimaler Verbindung eh nicht gut unter)
Flash auf Clientseite ist natürlich auch eine Alternative.
Java würde ich wegen dem hohen Verbrauch des Loaders sowie der geringeren Verbreitung nicht für Clients benutzen (aber auf Serverseite gehts natürlich)
das ganze hat nur den Hacken, dass ich mich weder mit AJAX noch mit Flash auskenne^^
das mit dem Pushing hört sich auch ziemlich kompliziert an.

wie lässt es sich konkret umsetzten, die Information eines Angriffs von einem Spieler zu einem 2. zu übertragen?
also soweit ich es bis jetzt verstanden, brauche ich einen server (Java), der entweder alle Angriffe speichert oder direkt weitergibt.
Außerdem brauche ich einen client, der möglichst nicht in Java sondern mit AJAX oder flash greschrieben ist.
Können dabei mehrere clients gleichzeitig auf den server zugreifen?
und wie bekommt der client die Information, dass ein neuer Angriff für ihn eingegangen ist?
so ganz verstehe ich das Prinzip noch nicht glaube ich...
 
Gibt es keine Möglichkeit, eine direkte Netzwerk-Verbindung zwischen 2 Spielern aufzubauen, ohne einen server "dazwischenzuschalten"?
Nein. Jeder halbwegs sichere Browser wird das verhindern, egal ob du Javascript/Ajax, Java oder Flash verwendest.
 
Last edited by a moderator:
@liutasil

Wenn du auf ServerSeite PHP einsetzt/einsetzen kannst und auf Clientseite javascript einsetzen willst, kann ich dir vielleicht diesbezueglich helfen
ICQ: 248-978-444
 
so ich habe mich jetzt mal in das Ganze eingearbeitet
ich werden wahrscheinlich Java auf Serverseite und Flash als Client benutzen
ich habe auch schon einen Beispielserver und -client geschrieben und Tomcat installiert
doch jetzt stehe ich vor einem Problem:
Wie bringe ich den Server dazu, dass er das Programm ausführt?
die meisten Servlets die ich bis jetzt gesehen habe, werden nur beim Aufrufen über den Browser ausgeführt. Aber für ein Game müsste das Programm ja die ganze Zeit über laufen
 
Last edited by a moderator:
Ich kenne mich mit JAVA nicht aus, aber warum muss das Programm die ganze Zeit laufen? Du kanns doch die Werte und Zwischenergebnisse eines Kampfes in eine Datenbank speichern und nur bei Useraktionen das Skript aufrufen, welches dann die Daten aus der DB holt und entsprechend dem anderen User die Ergebnisse, Meldungen etc zusendet.
 
Back
Top