massive Abfrage von verschiedenen Inszanzen/Feldern

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • massive Abfrage von verschiedenen Inszanzen/Feldern

      Hallo alle zusammen!

      Wiedermal habe ich eine Frage auf die ich keine Antwort finde.
      Es geht um das schnelle abfragen von verschiedenen Objekten auf jeweilige Zustände.

      Als Beispiel: Viele kennen sicher das Game "Boulder-Dash" (Gott hab ich das auf dem Gameboy geliebt. XD)
      In dem Game fallen diie steine immer vertikal von oben nach unten. Nun, wir alle wissen das der alte Gameboy nich wirklich ein Rechenmonster ist. ^^

      Mich interessiert es jedoch wie man so viele Instanzen so schnell auf ihre zustände Abfragen kann, sodass eine beinahe (gleichzeitichkeit) enstehd. Ständig fallen so viele Blöcke hintereinander runter
      ohne in irgendeiner Art und Weise ohne die CPU stark zu beanspruchen. Mich würde interessieren wie genau diese Zustände abgefragt werden sodass dies so schnell geht.

      Natürlich könnte ich jedem Objekt innerhalb des Step events diese Zustände abfragen (wäre aber bei einer sehr großen anzahl an Instanzen jedoch suboptimal), außerdem wollte ich mich allgemein erkunden ob das auch außerhalb von Instanzen (z.B: bei einem Grid) realisierbar ist.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von LEWA ()

    • Zum Beispiel Boulder Dash kann ich nur sagen, dass es nicht wirklich notwendig ist, durchgängig alle Instanzen abzufragen. Es reicht ja, die Instanzen zu kontrollieren, die im Einflussbereich des Spielers liegen.
      Z.B. brauchen Steine, die sich unter dem Spieler selbst befinden garnicht beachtet zu werden, da sie nur fallen können wenn der Spieler sich unter ihnen hergräbt...

      MfG Waterman7 Ponyman7
    • Darüber habe ich auch schon nachgedacht. Jedoch kann ich mich noch dunkel errinern das in "Boulder Dash" für den alten Gameboy der ganze Room behandelt wurde.
      Zumindest fiel mir keine "Grenze" auf ab der die Instanzen deaktiviert wurden. (Und unter auffallen meine ich: Ich habe einen riesigen Berg an Steinen zum Rollen gebracht,
      lief quer durch die Map bis ans gegenüberliegende Ende und nach kurzer Zeit lief ich zurück und siehe da: Die Menge an Blöcken lag schon fertig angesammelt am Boden.)
      Könnte mich in diesem Punkt aber auch irren. Ist lange her das ich das gezockt habe.

      Es geht mir hier jedoch nicht primär um Instanzen, sonder generell um eine Methode wie man z.B: jedes einzelne Element eines GRIDS so schnell abfragen kann.
    • So wie ich das sehe, bewegen sich alle Blöcke in einem festen Raster. Dafür nimmt mal also z.B. einen Array, in dem für jedes Feld das derzeitg befindliche Objekt abgespeichert wird.

      Wie man dann "herausfindet" bzw. dem Programm klar macht, wo in dieser Matrix etwas zu tun ist, hängt wohl von der Hardware und dem genauen Gameplay ab.
      Ich kann mir aber vorstellen, dass ein einfaches Durchgehen der gesamten Matrix auch auf einem C64 / GB kein Problem war.
    • So wie ich das sehe, bewegen sich alle Blöcke in einem festen Raster. Dafür nimmt mal also z.B. einen Array, in dem für jedes Feld das derzeitg befindliche Objekt abgespeichert wird.

      Darum frage ich ja nach wie man das mit einem Grid realisieren könnte. ^^

      Jedoch ist es nicht gerade optimal die Map mithilfe von 2 For schleifen abzufragen, da der GM in diesem Bereich extremst langsam ist.
      Zwar habe ich es schon realisiert in einem Grid innerhalb eines Steps nur 10-20 elemente Abzufragen (dadurch verhindere laggs während des Spielgeschehens) jedoch ergibt sich daraus auch nicht so eine optimale geschwindichkeit wie bei dem Gameboy Produkt.
      Ich bin mit etwaigen Algorithmen (falls es überhaupt welche gibt...) für solche Sachen so gut wie garnicht vertraut und darum habe ich es mal gewagt hier um Hilfe zu fragen. :)
    • Feldweise ca. 200*200.

      Mir ist schon bewusst dass es etwas übertrieben ist. (normalerweise nutze ich sogar 300*300) jedoch sollte es dafür eine halbwegs aktzeptable Lösung geben. :) (Wenn nicht, muss ich halt nur den Bereich um den Player herum abfragen.)
      Für die 2 For-schleifen (eine geht horizontal durchs Grid und ruft dabei eine 2te auf die vertikal alles ausliest) ist das Grid (für den Game Maker) zu groß.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

    • Im GM ist sowas nunmal sehr, sehr langsam. In c++ wäre so ne Schleife ganz einfach und efektiv. Für das Gameboy wurde das Spiel wahrscheinlich auch sehr "maschienennah" programmiert.
      Kann dir nur empfehlen arrays zu nehmen (das auslesen/schreiben ist viel schneller als bei ds_grids) und repeat-schleifen zu verwenden.
      Das abfragen jeden step ob die Variable kleiner ist als der Wert kostet viel zeit. Repeat schleifen scheinen im allgemeinen darum viel schneller zu sein.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)
    • Du kannst das "Bearbeitungsareal" auf ungefähr die View reduzieren (bzw. leicht darüber, damit man a) vor fallenden Blöcken nicht fliehen kann und b) die Physik weiter ausgeführt werden kann, bevor der Spieler die betreffenden Blöcke in ihrer "Starre" sieht).

      Damit sollte alles noch funktionieren und den Aufwand erheblich verkleinern.
    • Hast schon recht. Wäre für den GM wirklich die beste Variante.

      Besteht die Möglichkeit diese Berechnung des Arrays/Grids nicht in eine dll zu packen?
      Sollte doch merklich schneller laufen wenn das alles nicht mehr intern im GM berechnet wird.

      Ich weiss ich klinge jetzt ziemlich "noobig" jedoch habe ich noch nie in meinem Leben mit DLLs zu tun gehabt und kenne daher nicht wirklich die Performance die man damit "entfalten" kann.
    • nein, eine Physik möchte ich nicht. ^^

      Ich wollte blos mal die möglichkeit in betracht ziehen evtl selbst mal ne simple dll zu entwerfen wo die for schleifen bzw das repeat innerhalb der DLL abgehandelt werden und nicht im GM.
      Ich weiss blos nicht ob mir das einen ausreichenden Performanceschub geben könnte.
    • Die Berechnungen an sich wäre schnon schneller nur die Anbindung zur DLL wär ein großes problem. Du kannst pro FFunktionsaufruf nur sehr wenige ARgumente der DLL übergeben und nur einen einzigen Weg zurück geben lassen. Datenstrukturen lassen sich auch nicht übergeben.
      Es wäre theoretisch möglich es mit der GMApi zu tun. Mit der kann man sich quasi in das Spiel hacken und direct ohne gml variablen und Werte verändern... man braucht aber recht gute Kenntnisse... diese würde aber einen enormen schub geben allerdings kann man das Spiel dann auch gleich in C schreiben...

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)