Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Hilfe bei Ressourcenproduktionsproblem

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Hilfe bei Ressourcenproduktionsproblem

    Hallo Leute,
    da ich eine kleine Zeitbeschäftigung suche habe ich angefangen ein kleines einfaches und simples Browsergame zu erstellen... Allerdings habe ich ein Problem festgestellt mit der Ressourcenproduktion.

    Über die Suche habe ich auch viele andere Themen gefunden die mir geholfen haben, allerdings war keines so wie meines welches ich gefunden hatte.

    Mein Problem ist, das ich die Ressourcen bei jedem Seitenaufruf in der Datenbank zu dem Dorf speicher... Allerdings wenn dann jemand so schlau ist, F5 gedrückt zu halten, kackt der MySQL-Server ab und verarbeitet jetzt erstmal die ganzen anfragen und Querys...

    Ich habe jetzt schon mehrere gefragt, wie ich das umgehen könnte, und jeder meinte, wenn ich die Ressourcen alle 10-60 Min zu aktualisiere (so wie es andere auch machen), aber da stellt sich mir die Frage, wie halte ich die Anzeige immer aktuell ohne das bei jedem Seitenaufruf zu aktualisieren? Darauf hatte keiner von denen die Antwort...


  • #2
    Da müsstest du wohl BlackScorp anschreiben, der ist da sehr versiert in diesem Bereich.

    Nun, das kommt ganz auf das Design deines Spieles drauf an. Fortgeschritten ist es auf jeden Fall nicht. Wenn du definierst, dass nur jede Stunde Ressourcen gutgeschrieben werden, dann ist das nun mal so. Eine Kuh produziert auch rund 0.9l Milch/h, sie wird jedoch nur einmal am Tag gemolken, also produziert sie 23h lang "nichts" und dann 21.6l innerhalb einer Stunde.

    Werde dir also klar, wie präzise es sein muss. Und dann wirst du vermutlich nicht über Cronjobs wegkommen, die können das für dich erledigen. Oder du arbeitest mit Gearman oder einem anderen Framework, dass dir Parallelität ermöglicht und rechnest diese Dinge im Hintergrund.
    GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

    Kommentar


    • #3
      Okay danke,
      ich werde mich bei ihm mal melden.

      Und Gearman werde ich mir auch mal angucken

      Kommentar


      • #4
        Wie Christian sagte du braucht eine zeitspanne + produktion pro einheit und daraus ermittlest du rohstoffe.

        also bei jeder aktion eines users trägste die aktuelle uhrzeit in die datebank(in der user tabelle heißt es bei mir meist, last_action) die spalte brauchste ja sowieso um zu zeigen wieviele user online sind.

        wenn ein user im spiel was macht, nimmste seine letze aktion, ziehst davon die aktuelle zeit ab und hast somit eine zeitspanne. dann nimmst du die produktion und rechnest um wieviel rohstoffe der user produziert hat seit seiner letzen aktion, diesen wert addierst du drauf.

        wenn der user nun immer wieder F5 drück so hast denoch automatisch nur den unterschied und addierst nicht blind drauf
        apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

        Kommentar


        • #5
          genauso mache ich das ja momentan
          Vielleicht war das falsch erklärt was mein Problem ist.

          Wie unterdrücke ich es, das der User F5 gedrückt hält und somit andauernd die Datenbank updated? Das sind ja unmengen an Updates die da alle nacheinander geupdatet werden müssen... und somit hängt in der Zeit ja das ganze Spiel

          Kommentar


          • #6
            Dass das Spiel hängt, hat sicherlich andere Ursachen, hast du deine Tabelle mit MyIsam oder InnoDB engine angelegt? dann wieviele parallele zugriffe erlaubt deine Datenbank usw.. eigentlich sollte F5 gedrückthalten keine Probleme verusachen. Die viele Updates kann die Datenbank ab
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

            Kommentar


            • #7
              Die Datenbank ist in innoDB
              Ich hatte das ganze in einer vagrantbox & puphpet getestet und da hing das ganze etwas länger, aber wie es auf meinem Server aussieht kann ich nicht sagen... Probiere ich heute Abend mal aus.

              Okay, das ist gut zu wissen, das die Datenbank so viele Abfragen ab kann... Ich kenne mich da nicht so gut aus

              Kommentar


              • #8
                http://nikic.github.io/2011/12/27/Do...ASP-SOLID.html

                Premature Optimization is ein Teil von STUPID halt dich nicht damit auf, besser, baue log methoden oder messe die zugriffe mit tools wie xhproof etc, das was du messen kannst, kannst du auch optimieren.

                nur weil du eine vermutung hast dass jemand ganze zeit F5 gedrückt halten will, muss es ja nicht gleich stimmen
                apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

                Kommentar


                • #9
                  Das Einzige, was eventuell entstehen könnte sind gewisse Ungenauigkeiten beim Berechnen von Rohstoffen, wenn diese nicht in genaue, dezimale Werte aufgeteilt werden können. Sobald du Rohstoffe von 0.49 Einheiten hinzufügen musst wird es mühsam. Ausser du rechnest innerhalb der Datenbank mit DECIMAL und castest zu Integer bei der Ausgabe der Informationen.

                  Ich würde da eventuell eine Sperre einbauen, die das Update nur alle x Sekunden (10, 15, ...) erlaubt.
                  GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                  Kommentar


                  • #10
                    ach einfach alles was hinter der 0 wegschneiden, wenn jemand jetzt städig F5 drückt, kriegt er eben ganze zeit nichts
                    apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

                    Kommentar


                    • #11
                      Zitat von ChristianK Beitrag anzeigen
                      Das Einzige, was eventuell entstehen könnte sind gewisse Ungenauigkeiten beim Berechnen von Rohstoffen, wenn diese nicht in genaue, dezimale Werte aufgeteilt werden können. Sobald du Rohstoffe von 0.49 Einheiten hinzufügen musst wird es mühsam. Ausser du rechnest innerhalb der Datenbank mit DECIMAL und castest zu Integer bei der Ausgabe der Informationen.

                      Ich würde da eventuell eine Sperre einbauen, die das Update nur alle x Sekunden (10, 15, ...) erlaubt.
                      Zitat von BlackScorp Beitrag anzeigen
                      ach einfach alles was hinter der 0 wegschneiden, wenn jemand jetzt städig F5 drückt, kriegt er eben ganze zeit nichts
                      dann kann ich mir auch das ganze Query sparen an der Stelle :P
                      Aber wäre mal ne Idee, die Ressourcen weniger zu machen oder die updates nur alle 10-20sec zu akzeptieren.
                      Ich setze das Thema mal auf erledigt

                      @BlackScorp dein Forum über Browsergames sieht auch sehr interessant aus, evtl sieht man sich da mal

                      Kommentar


                      • #12
                        memcached

                        Schreib Dir doch die IP des Kunden in den memcached, setz da die Expiry auf den Wert, wie lange Du von der Adresse keine Requests bekommen willst und schau beim eingehenden Request kurz im m., ob die IP da noch drin ist. Falls ja -> bye bye

                        Im Allgemeinen (zumindest mal bei den Browsergames von einem der ganz großen Publisher...) werden sämtliche Berechnungen (Resourcen, Kämpfe etc.) übriges mit einem Eventloop bearbeitet, der eben alle n Sekunden über eine Event-Tabelle (Queue) drüberläuft und die abarbeitet. Sollen Dinge periodisch getan werden, dann wird das Event nach der Abarbeitung mit einem neuen Fälligkeits-Zeitstempel wieder in die Queue (zurück)gelegt.
                        Dinge in einem Browsergame nur dann zu berechnen, wenn sie gerade gebraucht werden, ist nicht nur fürchterlich kompliziert zu implementieren sondern bringt Dich auch noch in die Situation, dass manchmal riesige Mengen an Daten gleichzeitig berechnet werden müssen (= Datenbank hängt dann mal ne Weile) sowie dass Du nicht vernünftig abschätzen kannst, ob Deine Hardware für die Anzahl User im Spiel ausreichend dimensioniert ist. (Weil Du eben diese Peaks hast)

                        Emm... wenn Du keinen memcached hast (und ihn auch nicht installieren kannst) geht natürlich die Datenbank genauso gut. Dann musst nur die Expiry-Sache selbst implementieren: "DELETE FROM locklist WHERE expires (<- das ist ein INT) < FROM_UNIXTIME(NOW());" <- und das alle n Sekunden laufenlassen. (-> Cronjob)

                        Kommentar


                        • #13
                          Ganz optimal machst du das mit parallelisierter Verarbeitung (ich bringe wieder einmal Gearman ins Spiel) und somit sehr guter horizontaler Skalierbarkeit. Ein Server-Task, der den Betrieb sicherstellt und die Clients tätigen im Prinzip nur Abfragen. Eine Aufgabe wird in eine Queue eingetragen und vom Server-Task abgearbeitet.

                          Im Endeffekt müssen sich Ressourcen immer aus Ressourcen pro Zeiteinheit multipliziert mit vergangener Zeit ergeben. Eine Event-Queue kann auch einmal still stehen.
                          GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                          Kommentar


                          • #14
                            Zitat von ChristianK Beitrag anzeigen
                            Eine Event-Queue kann auch einmal still stehen.
                            Selbstverständlich muss (immer) mit dem Delta zum letzten Event gearbeitet werden...

                            Kommentar

                            Lädt...
                            X