Hi,
ich hab mich nun auch dazu entschlossen mein erstes Browsergame zu programmieren.
Für die Entwicklung stellt sich mir eine grundsätzliche Frage - wie vergebe ich die Ressourcen?
Angenommen ein Benutzer bekommt pro Stunde 600$ - wie realisiere ich, dass er jede Minute 10$ bekommt? Oder alle paar Sekunden 1$...?
Einen Cronjob alle paar Sekunden durchlaufen lassen kann ja nicht das wahre sein... das würde den Server sprengen.
Wie macht ihr das?
Vielen Dank für eure Antworten im Vorraus
Ressourcen aufstocken - Cronjob?
gepostet vor 19 Jahre, 2 Monate von eizil2k
gepostet vor 19 Jahre, 2 Monate von Kampfhoernchen
Wir berechnen die Rohstoffe in Echtzeit. Immer wenn ein Script aufgerufen wird, wird geguckt, ob seit der letzten Aktualisierung mehr als 1 Min vergangen ist, wenn ja, werden die Rohstoffe auf die Sekunde genau aktualisiert. Nachteil: Man muss die Rohstoffe als Float / Double in die DB schreiben und beim rausholen ABrunden (betonung auf "ab").
Alternativ von uns diskutiert:
Alle 30 Min ein Cron zur Rohstoffberechnung, und dazwischen mit Javascript immer aktuell halten. Nachteil: Es muss beim bauen usw. die Differenz auch auf Serverseite berechnet werden.
Noch ne Alternative: Runden statt Echtzeit
Alternativ von uns diskutiert:
Alle 30 Min ein Cron zur Rohstoffberechnung, und dazwischen mit Javascript immer aktuell halten. Nachteil: Es muss beim bauen usw. die Differenz auch auf Serverseite berechnet werden.
Noch ne Alternative: Runden statt Echtzeit
gepostet vor 19 Jahre, 2 Monate von poncho
Und noch eine Möglichkeit:
Ein Event-System
Alle Ereignisse (Flotten, Bauaufträge...) werden in eine Event-Tabelle eingetragen und von einem Daemon abgearbeitet. Der Vorteil ist, dass es dabei unmöglich ist, dass sich verschiedene Ereignisse überschneiden (wie es beim Ausführen direkt durch die Webseite der Fall sein kann).
Rohstoffe werden in der Datenbank nur geändert, wenn ein Ereignis darauf Einfluss hat. Ansonsten reicht es, wenn man den aktuelen Bestand live berechnet - Das spart Rechenleistung.
Ein Event-System
Alle Ereignisse (Flotten, Bauaufträge...) werden in eine Event-Tabelle eingetragen und von einem Daemon abgearbeitet. Der Vorteil ist, dass es dabei unmöglich ist, dass sich verschiedene Ereignisse überschneiden (wie es beim Ausführen direkt durch die Webseite der Fall sein kann).
Rohstoffe werden in der Datenbank nur geändert, wenn ein Ereignis darauf Einfluss hat. Ansonsten reicht es, wenn man den aktuelen Bestand live berechnet - Das spart Rechenleistung.
gepostet vor 19 Jahre, 2 Monate von Kampfhoernchen
hab ich dich richtig verstanden?
Du holst die Daten aus der Rohstofftabelle raus und berechnest dann das was dazugekommen ist seit dem letzten Event.
Du holst die Daten aus der Rohstofftabelle raus und berechnest dann das was dazugekommen ist seit dem letzten Event.
gepostet vor 19 Jahre, 2 Monate von eizil2k
Hi,
ich habe mir noch ein paar andere Gedanken gemacht, und will das so lösen:
Beim Login werden die Rohstoffdaten in die User Session geladen, z.B.:
Stein Stufe 2
Stein Vorrat: 1000
Stein Produktion: 100 (pro Stunde)
und der Timestamp des letzten Updates.
Nun werden bei jeder aktualisierung die Daten nicht mehr aus der Datenbank ausgelesen, sondern aus den Session Daten berechnet.
(Steinvorrat + Steinproduktion / vergangene Zeit)
Die Aktualisierung der DB und der Session Daten soll dann nur noch alle 30 Minuten oder sowas erfolgen, sowie wenn Gebäude fertig gestellt werden oder andere Events eintreten (Handel usw.).
Somit kann ich während des Spiels eine Menge DB Aufrufe sparen und die Daten werden trotzdem in Echtzeit angezeigt... d.h. der User merkt nichts davon.
ich habe mir noch ein paar andere Gedanken gemacht, und will das so lösen:
Beim Login werden die Rohstoffdaten in die User Session geladen, z.B.:
Stein Stufe 2
Stein Vorrat: 1000
Stein Produktion: 100 (pro Stunde)
und der Timestamp des letzten Updates.
Nun werden bei jeder aktualisierung die Daten nicht mehr aus der Datenbank ausgelesen, sondern aus den Session Daten berechnet.
(Steinvorrat + Steinproduktion / vergangene Zeit)
Die Aktualisierung der DB und der Session Daten soll dann nur noch alle 30 Minuten oder sowas erfolgen, sowie wenn Gebäude fertig gestellt werden oder andere Events eintreten (Handel usw.).
Somit kann ich während des Spiels eine Menge DB Aufrufe sparen und die Daten werden trotzdem in Echtzeit angezeigt... d.h. der User merkt nichts davon.
gepostet vor 19 Jahre, 2 Monate von friedenspanzer
Musst du aber bei der Aktualisierung aufpassen. Also wenn was gebaut wird in Session UND DB ändern (sonst kann es zu unschönen Sprüngen oder noch schlimmer Berechnungsfehlern kommen). Gilt natürlich auch wenn Ress dazukommen.
gepostet vor 19 Jahre, 2 Monate von eizil2k
Original von friedenspanzer
Musst du aber bei der Aktualisierung aufpassen. Also wenn was gebaut wird in Session UND DB ändern (sonst kann es zu unschönen Sprüngen oder noch schlimmer Berechnungsfehlern kommen). Gilt natürlich auch wenn Ress dazukommen.
Ist klar, bei Aktionen hatte ich vor die Datenbank zuerst abzufragen, ob auch wirklich genügend Ressourcen vorhanden sind und anschließend sowohl die Session Daten als auch den Datensatz zu aktualisieren.
gepostet vor 19 Jahre, 2 Monate von Bit
hm, also, beim Bauen, oder anderen Ereignissen, die mit den Ressourcen zu tun haben, würd ich die DB aktualisieren und dabei auch den Inhalt der Rohstoffe in der Session-Variable überprüfen/überschreiben.
Ansonnsten, eben, berechnen ab letzter aktualisierung und nur neu in die DB schreiben, wenn ein relevantes Ereignis eingetreten ist. Ich halte es nicht für nötig, dass die Ressourcen in der DB permanent aktualisiert werden. Bedingt allerdings auch, dass die DB auch aktualisiert wird, wenn Bauaufträge oder anderes beendet sind, da sich ja oft die Produktionsmenge dann verändert (ausser man schreibt die Veränderungen auch in ein History-File, was dann aber zur Berechnung sehr komplex werden könnte).
Ansonnsten, eben, berechnen ab letzter aktualisierung und nur neu in die DB schreiben, wenn ein relevantes Ereignis eingetreten ist. Ich halte es nicht für nötig, dass die Ressourcen in der DB permanent aktualisiert werden. Bedingt allerdings auch, dass die DB auch aktualisiert wird, wenn Bauaufträge oder anderes beendet sind, da sich ja oft die Produktionsmenge dann verändert (ausser man schreibt die Veränderungen auch in ein History-File, was dann aber zur Berechnung sehr komplex werden könnte).
gepostet vor 19 Jahre, 2 Monate von poncho
Original von Kampfhoernchen
hab ich dich richtig verstanden?
Du holst die Daten aus der Rohstofftabelle raus und berechnest dann das was dazugekommen ist seit dem letzten Event.
Ja.
Ist ja nichts weiter als Rohstoff = verstrichene Zeit * Produktion
Damit ist selbst der langsamste Server nicht überlastet
gepostet vor 19 Jahre, 2 Monate von Bit
Seh ich auch so poncho, eine effektive aktualisierung in der DB ist unnötig, solange sich die Produktionsmenge der Minen (oder was es dann auch immer ist) nicht verändert und die Energiemenge ausreichend ist (auch hier ist eine Überprüfung nur bei Veränderungen nötig).
Die aktualisierung der DB ist somit auf ein akzeptables Minimum beschränkt, mehr geht nur noch mit Logfiles, die dann im Nachhinein Änderungen nachrechnen, aber, das kann sehr schwer werden und die Gefahr, dass man sich da verhakt ist schon sehr gross. Die aktuelle Anzeige so sehr aufwändig und nicht leichter zu berechnen, aber, vor allem stehen den halbwegs eingesparen DB Zugriffen ein enormer Rechenaufwand gegenüber, um das alles aus den Logfiles nachzurechnen.
Ergo, zumindest ich kenne keine effizientere Methode, als nur bei jeder Änderung den effektiven Ressourcenbestand in die DB zu schreiben.
Die aktualisierung der DB ist somit auf ein akzeptables Minimum beschränkt, mehr geht nur noch mit Logfiles, die dann im Nachhinein Änderungen nachrechnen, aber, das kann sehr schwer werden und die Gefahr, dass man sich da verhakt ist schon sehr gross. Die aktuelle Anzeige so sehr aufwändig und nicht leichter zu berechnen, aber, vor allem stehen den halbwegs eingesparen DB Zugriffen ein enormer Rechenaufwand gegenüber, um das alles aus den Logfiles nachzurechnen.
Ergo, zumindest ich kenne keine effizientere Methode, als nur bei jeder Änderung den effektiven Ressourcenbestand in die DB zu schreiben.
gepostet vor 19 Jahre, 2 Monate von Kallisti
Wenn ihr Realtimeressourcenverteilung (also zB jede Sekunde Foerderung) wollt, ist es sicher schwierig. Bei Ressourcenticks wuerde ich immer noch die normale Verteilung an alle z.B. alle 15 Minuten favorisieren. Das ist ein update mysql query alle 15 Minuten, ansonsten wird dann nur gelesen.
Alle anderen Methoden empfinde ich als ziemlich haarig, da sollte man sehr sehr vorsichtig sein...
Dann wuerde ich mich aber wohl fuer logintimestamp und ress als Session Variablen entscheiden und auf Basis dieser weiterrechnen. Bei wechselnden Minenlevels (je nach Konzept des Spiels), kann dies jedoch sehr kritisch sein.
Alle anderen Methoden empfinde ich als ziemlich haarig, da sollte man sehr sehr vorsichtig sein...
Dann wuerde ich mich aber wohl fuer logintimestamp und ress als Session Variablen entscheiden und auf Basis dieser weiterrechnen. Bei wechselnden Minenlevels (je nach Konzept des Spiels), kann dies jedoch sehr kritisch sein.