mmofacts.com

Fertigstellung gebäude!

gepostet vor 17 Jahre, 5 Monate von Dorgo
Hallo,
ich habe da ne frage, angenommen ich habe nun ein Gebäude script und es wird in der Datenbank gespeichert wann er fertig ist also sagen wir um 12:00 Uhr, und der User ist aber zu diesem zeitpunkt ned on, ich habe es immer nun so gemacht das alle geupdatet wird wenn er on geht --> also das gebäude was fertig ist dann +1. nur das problem ist bei angriffen das, dass dann immer die falschen werte hat.
Nun war meine idee alle 2 min einen Cronjob laufen zu lassen der schaud ob eventuell etwas fertig ist und der stellt dies dann richtig ein, also +1 eben, aber da war nun meine gedanke ob das nicht sehr serverlastig wäre denn bei 5k spielern alle 2 min die db durchzuschaun ist ja recht viel.
Naja wie habt ihr das so gelöst?
Villeicht kennt ja wer BiteFight da ist es ja beim jagen auch so, wenn du fertig bist bekommst ne pn, nur wie wird die versendet wenn der user zu dem zeitpunkt ned online ist...
Ich hoffe Ihr wisst was ich meine, würde um ideen bitten .
Sorry wegen meiner Rechtschreibung aber bin leider Legasteniker.
mfg,
Dorgo
gepostet vor 17 Jahre, 5 Monate von None
Du erstellst ne Methode update() die vor jeder Aktion aufgerufen wird, die aktuelle Daten benötigt.
Wozu solcher CronJob Quatsch? Das verbrät ne Menge unnötige Ressourcen und bei vielen Usern ist die Steuerung der Jobs ein komplexes Unterfangen. Wer sagt denn das bei 1000 oder mehr Usern dein Job nur 2 Minuten braucht?
Du kannst doch locker alles so - bei Bedarf - errechnen. Wird er nicht angegriffen oder logt er sich nicht ein, ist es doch egal ob alte Daten in der Datenbank stehen.
gepostet vor 17 Jahre, 5 Monate von Sensei
ich sehe das ähnlich wie samson
cronjobs fressen dir zu viele ressourcen.
ich würde das ganze zweiteilen:
gebäude oder was auch immer die für kämpfen oder ähnliches nötig sind auch in abwesenheit der user, kannst du permanent checken lassen.
alles andere beim login
meine meinung^^
gepostet vor 17 Jahre, 5 Monate von Kapsonfire
wieso verbraucht cronjob viel ressourcen?
bei mir läuft alles und verbraucht fast keine ressourcen
erstmal fragt er ab ob es nötig ist... wenn es nicht nötig ist macht der exit und wenn doch berechnet er die sachen
beim bauen sollte das kein problem sein......
wenns darum geht mehrere tausende userzeilen zu bearbeiten würde ich empfehlen den umgang mit c++ zu erlernen... mache ich z.B. auch
das spart bei mir knapp 80% ressourcen (das script wird aber auch alle $x min ausgeführt.
gepostet vor 17 Jahre, 5 Monate von None
Aus einem simplen Grund: du errechnst mehr als du brauchst. Auch inaktive User werden berechnet, ob die Daten nun benötigt werden oder nicht prüfst du nicht.
Du errechnest alle User, wir - mit dem RealTime-Konzept keine 10% über den gleichen Zeitraum (natürlich je nach Spiel und Events die eintreten in der Zeit).
Edit: finde es auch wesentlich eleganter wenn alles schön in der Applikation selbst abläuft und man keine externen Ressourcen braucht. Das ist das tolle an Java: ich schieb nen jar auf den Server und es tut
gepostet vor 17 Jahre, 5 Monate von Todi42
Ich mach das z.Z. mit cron. Dabei durchsuche ich aber nur die Bauaufträge, nicht alle Spieler. Mit einem Index auf die Fertigstellungszeit, sollte es wohl recht fix gehen, alle Bauaufträge, die zu einem gegebenen Zeitpunkt fertig sein sollten zu ermitteln.
In einem anderen Projekt müste ich mal ausbleibende Zugstandortmeldungen überwachen. Da hatte ich dann einen eigenen Prozess, der eine Queue mit entsprechenden Zeitpunkten enthielt. Mit jeder Änderung der Daten, von denen der Zeitpunkt abhängt, muss dann entsprechend diese Queue aktualisiert werden.
gepostet vor 17 Jahre, 5 Monate von Drezil
ich hab ne update_player()-funktion.
in meiner alten version hatte ich wie todi schon andeutet einfach eine talbelle mit den bauaufträgen. die abgefragt mit nem select * from geb where zeit > now() liefert mir die 2-3 gebs die fertig gebaut werden müssen.
ist in meinem neuen konzept leider nicht möglich. aber bevor mit jemanden eine interaktion gestartet wird (handel, kampf, ..) wird grad einmal update_player($uid) gemacht. ist natürlich nur suboptimal, wenn tonnenweise berechnungen nach 1 klick gemacht werden müssen, weil der andere sich seit 3 monaten nicht eingeloggt hat..
aus performancegründen könnte ich auch die ganze rechnerei in den c++-daemon verlagern. da der persistent läuft kann der ja z.b. alle daten im ram halten und in echtzeit errechnen. wenn ich die daten benötige, gibt es ein kurzes "flush player xxx" auf dem socket und der daemon ballert den aktuellen stand in die db..
aber vielleicht ist das auch der overkill schlechthin.. ich bleib erstmal bei meiner php-lösung. noch habe ich ja nichtmal die alpha-phase erreicht .. und soo schwer wäre eine spätere umstellung auch nicht.
gepostet vor 17 Jahre, 5 Monate von None
Das mit dem "Aktion nur bei Useraktion" hatte ich am Anfang auch.
Später bin ich auf einen Daemon umgestiegen, der Tick-Genau die Aufträge in der benötigten Reihenfolge ausführte.
gepostet vor 17 Jahre, 5 Monate von GoGCaM
Hmm aber wenn ihr die Events von den User abhängig macht, wie könnt ihr folgendes (einfaches) Szenario lösen?:
Ein User baut ein Gebäude, welches Rohstoffe produziert. Der Gebäudebau wird abgeschlossen und der User loggt sich 3 Tage später ein. Wie berechnet ihr die neu produzierten Rohstoffe dieses Gebäudes?
gepostet vor 17 Jahre, 5 Monate von None
Wurde bei mir alle 15 Minuten für alle Accounts durchgeführt.
Hier mal wie es bei mir lief:
* Bauaufträge / Forschungen - Tickgenau
* Resourcenverteilung - Alle 15 Minuten zzgl. bei Fertigstellung eines Upgrades
* Kampf (*hust* war nie drin, sollte auch Tickgenau sein)
* Erkundung - Tickgenau
Es kam zum Glück nur sehr selten vor, daß sich die Aufträge gestaut haben. In der Regel war dann aber irgendwo was ziemlich im Argen und der Daemon machte einfach einen Automatischen Neustart.
gepostet vor 17 Jahre, 5 Monate von Dorgo
woow, danke für die vielen schnellen und sehr guten Antworten.
Werde mal dank eurer Hilfe mein BG umprogrammieren, wenn ich noch fragen habe poste ich wieder hier hinein.
Danke an alle .
mfg,
Dorgo
gepostet vor 17 Jahre, 5 Monate von Fabi^
@GoGCaM:
wenn es keine bauschleife gibt könnte man das update 2mal durchlaufen lassen.. einmal für die zeit bis zur fertigstellung des gebäudes und einmal für den zeitraum danach.. mit bauschleifen wird das ganze noch viel fummeliger..
in der aktuellen version meines spiels hab ich das so auch noch nicht gelöst.. bzw hab diese lücke nicht gesehn, dass die spieler entweder belohnt oder betrogen werden
für die neuprogrammierung des spiels bin ich mir auch noch nicht schlüssiß ob ich die idee wirklich umsetzen möchte aber etwas viel besseres fällt mir leider auch nicht ein.
gepostet vor 17 Jahre, 5 Monate von None
Original von GoGCaM
Hmm aber wenn ihr die Events von den User abhängig macht, wie könnt ihr folgendes (einfaches) Szenario lösen?:
Ein User baut ein Gebäude, welches Rohstoffe produziert. Der Gebäudebau wird abgeschlossen und der User loggt sich 3 Tage später ein. Wie berechnet ihr die neu produzierten Rohstoffe dieses Gebäudes?

Wir haben die Zeit in der das Gebäude fertig wurde, wir haben die jetzige Zeit, also haben wir auch die Zeit die diese neue Stufe existiert, oder?
Dadurch kann ich die Ressourcengewinnung ausrechnen (Minuten der Existenz der neuen Stufe * Ressourcengewinn pro Minute z.B.).
gepostet vor 17 Jahre, 5 Monate von GoGCaM
Ahh danke, stimmt, so funktionierts

Auf diese Diskussion antworten