Mit welchen Techniken können webbasierte Spiele die Ressourcen des Spielers häufig aktualisieren?

8

Vor langer Zeit gab es dieses webbasierte Spiel namens Utopia (und ich bin sicher, es gibt es immer noch), die Runden sind pro Stunde vorbei. Sie bekommen nur jede Stunde neues Gold / Holz oder was-nicht.

Bei einigen neueren webbasierten Spielen werden Ressourcen mit einer feineren Auflösung wie pro Minute erhöht. Angenommen, ein Spieler hat eine Lebensmittelproduktionsrate von 5 pro Minute - die Lebensmittelmenge des Spielers erhöht sich jede Minute. Ich bin mir nicht sicher, ob es sinnvoll ist, ständig einen CRON-Job zum Aktualisieren der SQL-Datenbank festzulegen. Ich gehe davon aus, dass diese verwendet wird, da sie webbasiert ist. Vielleicht irre ich mich jede Minute.

Welche Techniken verwenden diese webbasierten Spiele? Hinzugefügt bei Bearbeiten: Und kann die Datenbank die Last wirklich bewältigen?

Extrakun
quelle

Antworten:

7

Es scheint mir, dass Sie nur die Produktionsraten, die Basisressourcenebene und einen zuletzt aktualisierten Zeitstempel speichern könnten. Wenn Sie dann die tatsächliche Ressourcenebene kennen müssen, können Sie die Produktionsrate einfach mit der verstrichenen Zeit multiplizieren.

Wenn sich die tatsächliche Ressourcenebene ändert, aktualisieren Sie einfach die Basisebene. Wenn sich die Produktionsrate ändert, aktualisieren Sie die Basisebene auf die tatsächliche Ebene und den Zeitstempel auf die aktuelle Zeit.

Auf diese Weise aktualisieren Sie nicht jede Minute jeden Spieler (vermutlich auch die derzeit nicht angemeldeten), sondern nur Zeilen, die tatsächlich von den Spielern aktiv verwendet werden.

(Wenn Ihr Spiel einmal pro Minute "tickt", kann ich mir vorstellen, dass eine "Zugnummer" besser ist als ein tatsächlicher Zeitstempel.)

Ein Nebeneffekt dieses Systems besteht darin, dass Sie dieselbe Logik verwenden können, die zum Aktualisieren der Datenbank und zum Vorhersagen von Werten verwendet wird, ohne diese zu ändern - um nur die erforderlichen Informationen an den Client zu senden (anstatt sie einmal pro Minute zu aktualisieren) und um Vorhersagen zu treffen Werte auf dem Client.

Andrew Russell
quelle
3
Dies erfordert in einigen Fällen tatsächlich ein gewisses Verständnis der komplexen Mathematik. Erwägen Sie, Zinsen für Geld zu verdienen - das Hinzufügen von 1% Zinsen einmal pro Monat ist nicht gleichbedeutend mit dem Hinzufügen von 12% Zinsen einmal pro Jahr. Zweites Beispiel: Wenn die Wahrscheinlichkeit, dass ein Ereignis in einer bestimmten Minute eintritt, 10% beträgt, beträgt die Wahrscheinlichkeit, dass es nach 10 Minuten eintritt, nicht 100%. Interessanterweise ist dies nur eine sehr langsame Demonstration der physikalischen Probleme, die Menschen in anderen Spielen sehen, und die gleiche Methode kann verwendet werden, um sie anzugehen, d. H. Verwenden Sie einen festen Zeitschritt und führen Sie ihn so oft wie nötig aus, um ihn einzuholen.
Kylotan
7
Kylotan, ich würde Zinseszins und Mehrfachwahrscheinlichkeitschancen nicht als komplexe Mathematik klassifizieren. : P
Die kommunistische Ente
1
Es ist ein gültiger Punkt. Aber ich würde hoffen, dass jeder, der nichtlineare Ressourcenproduktion in seinen Spielen implementiert, versteht, wie es funktioniert;)
Andrew Russell
2
Dies ist jedoch nicht erforderlich, wenn Sie das alte regelmäßige Update verwenden. Das ist das ganze Problem, mit dem ich mich befasse - die Verwendung dieser Methode führt zu einem neuen potenziellen Fehler, der vorher nicht möglich war.
Kylotan
2
Könnten Sie nicht einen iterativen Prozess verwenden, um sicherzustellen, dass alles korrekt angewendet wird? Wenn sich ein Spieler anmeldet, "aktiviert" er jede der Ressourcen, die dann in einer Schleife ausgelöst werden, bis die Zeit des nächsten Ticks nach der aktuellen Systemzeit liegt. Ein bisschen ressourcenintensiver vielleicht, aber es sollte sich um die meisten nichtlinearen Systeme kümmern.
Lunin
5

In modernen SQL-Datenbanken, die häufig verwendet werden (MySQL, Postgres, Oracle, MSSQL usw.), können Sie gespeicherte Prozeduren so planen, dass sie in beliebigen Zeitintervallen ausgeführt werden. Es ist eine sehr einfache Methode zum Ausführen solcher Updates und macht das Aufrufen eines externen Skripts oder Programms überflüssig, um dies für Sie zu tun.

Auf diese Weise kann die Datenbank auch die Abfrage optimieren, die Sie nur einmal ausführen, anstatt sie jedes Mal auszuführen, wenn ein externes Skript sie aufruft. Daher ist sie vom Standpunkt der Leistung aus sehr nützlich. Dies gilt natürlich nur, wenn Ihre Updates trivial genug sind, um in der eigenen Skriptsprache Ihrer Datenbank programmiert zu werden. Ressourcenaktualisierungen, automatische Abmeldungen von Zeitintervallen, Löschen von Datensätzen und dergleichen sind hervorragende Kandidaten für diese geplanten gespeicherten Prozeduren.

Die Last, die Ihre Datenbank erfährt, ist höchstwahrscheinlich zu 99,9% auf das Laden von Seiten, Game Engine-Updates und dergleichen zurückzuführen, da ein beliebtes Spiel leicht Hunderttausende von Abfragen pro Sekunde haben kann. Im Vergleich zu der Last, die durch das Ausführen einiger Abfragen (obwohl solche, die einen großen Teil einer Tabelle berühren) einmal pro Minute entsteht, sollte die Last kein Problem darstellen. Das heißt, es sei denn, Sie aktualisieren Werte, die von der Datenbank indiziert werden. Sie sollten um jeden Preis vermeiden, indizierte Spalten zu aktualisieren, wenn Sie sich Gedanken über die Leistung machen.

Fuu
quelle
2

Zu den Updates:

Einige verwenden CRON-Jobs, die von Zeit zu Zeit auf eine bestimmte PHP-Seite gelangen.

Einige verwenden CRON-Jobs und führen diesmal einen bestimmten Prozess aus.

Ein anderer Ansatz besteht darin, "just in time" -Updates durchzuführen. Wenn eine Seite geladen wird, führen Sie alle ausstehenden Updates durch und führen Sie sie zu diesem Zeitpunkt aus. Dies ist im Allgemeinen das, was Sie tun müssen, wenn Sie keine CRON-Jobs oder Prozesse mit langer Laufzeit ausführen können.

Schließlich führen andere die gesamte Webanwendung als einen Prozess aus, sodass sie jederzeit aktualisieren können, wenn sie sehen, dass es Zeit ist.

Das endgültige System ist das beste, wenn Sie diese Option zur Verfügung haben, da Sie die Daten im Speicher speichern können. Das Aktualisieren einiger tausend Spieler einmal pro Minute ist trivial, wenn Sie nur Daten im RAM ändern, anstatt in eine herkömmliche SQL-Datenbank schreiben zu müssen.

Aber wenn Sie diesen Luxus nicht haben, können Sie eine Art Caching verwenden. So etwas wie memcached kann eine Option sein (abhängig von Ihrem Hosting), die einen halben Weg zwischen Speicher und Datenbank darstellt. Sie können transiente Werte im Memcache speichern und nur dann in der Datenbank speichern, wenn dies unbedingt erforderlich ist.

Zwischen Memcache und einer herkömmlichen SQL-Datenbank gibt es andere Optionen, z. die verschiedenen Schlüssel- / Wertspeicher oder Dokumentenspeicher: Dinge wie MongoDB , CouchDB , die Amazon- oder Google-Angebote usw., dh. alle Systeme unter dem Oberbegriff NoSQL . Diese bieten Ihnen normalerweise weder die generische Abfrageleistung noch immer die gleichen Sicherheitsgarantien wie bei einer herkömmlichen Datenbank, sind jedoch häufig viel schneller im Betrieb. (Was nicht so überraschend ist, da sie weniger für Sie tun.)

Dies setzt jedoch voraus, dass eine normale Datenbank die Last nicht bewältigen kann. In den meisten Fällen ist dies wahrscheinlich der Fall. Wenn ich 10.000 UPDATE-Aufrufe pro Minute ausführen muss, um die Ressourcenebene zu erhöhen, ist dies nicht sehr skalierbar, sobald Sie alles andere hinzufügen. Wenn Sie dies jedoch ändern, um die Ressource für alle Benutzer mit einem SQL-Aufruf zu aktualisieren, sehen die Dinge plötzlich viel positiver aus. Überschätzen Sie also nicht, wie teuer eine bestimmte Funktion ist, da sie häufig effizienter implementiert werden kann.

Kylotan
quelle
0

Ich bin für KISS : "Halte es einfach, dumm!"

Ich sehe keinen Grund, warum ein Cron-Job nicht funktionieren würde, und der Vorteil ist, dass Sie mit billigen Webhosting-Optionen häufig keine Befehle direkt ausführen können, aber Sie können Cron-Befehle ausführen. Es ist also kein teurer dedizierter Server erforderlich.

Sie können Ihren Update-Code auch in PHP oder Ihrer bevorzugten Sprache ausführen, indem Sie entweder den Befehl cron verwenden oder den Textbrowser verwenden. Die Anweisungen unter Konfigurieren von Cron-Jobs enthalten mehrere Beispielbefehle, mit denen Sie Ihre eigene Seite in regelmäßigen Abständen anpingen können.wget --spider http://yoursite.com/secretphppage.phplynx

Ricket
quelle
Ich glaube, ich mache mir mehr Sorgen um einen CRON-Job, der jede Minute ausgeführt wird und die Daten einiger hundert Benutzer gleichzeitig aktualisiert.
Extrakun
1
Ein Update auf mehrere hundert Datensätze einmal pro Minute ist für eine moderne Datenbank kein Problem. Ich weiß nicht, wie Ihre Abfragen aussehen, aber ein einzelner 'UPDATE'-Aufruf sollte auch bei Tausenden betroffener Zeilen eine gute Leistung bringen.
Bummzack
Und in welcher Welt gilt ein Cron-Job als "einfach"? Wenn Sie kein Systemadministrator sind, werden Sie wahrscheinlich wütend, wenn Sie sich nur die Konfigurationsdatei
ansehen
Die Welt der Webhosts, in der sie (normalerweise) keinen SSH-Zugriff gewähren, sodass sie eine einfache Schnittstelle zu Cron bieten müssen. Mein Webhost (Lunarpages) verwendet Cpanel, und ich finde es ziemlich einfach zu verwenden: img822.imageshack.us/img822/7022/easycron.png
Ricket
0

Ich erinnere mich, dass ich mir den Code eines Planetarion-Klons angesehen habe. Alles ist PHP, aber der Ticker-Code ist in rohem C - mit C MySQL-Bindungen. Da das Datenmodell sehr einfach war, erfolgen die Aktualisierungen sehr schnell.

Ariejan
quelle