Performance und Generator verbessern

  • GM 8

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

  • Performance und Generator verbessern

    Ich habe ein kleines Projekt wo aber starke Performance probleme laufen. Die normale fps liegt schon bei 15. Es ist (mal wieder) ein Minecraft 2D Clon. Ich habe schon überall Reduziert was ich finden konnte aber troz allem leidet die fps Bei vielen Blöcken. die Blöcke werden in einem 1.000 x 1.000 Array gespeichert es sind drei Arrays für die drei Ebenen. Habe schon gemacht das nur die blöcke im Sichtbereich gezeichnet werden. Sonst wäre die fps = 0 Auch verdeckte Blöcke werden nicht gezeichnet. Am besten ladet euch die Datei runter, auch wenn ihr dann nur riesige Scripte seht die ich selbst kaum verstehe was ich da gemacht habe. Sobalt man es startet wird die Map generiert wo erstmal viele Fehler erscheinen die ihr erstmals Ignoriert. Wenn ihr euch auf der Karte umschaut wird ihr ein riesiges verwirrendes Hölensystem sehen. Je tiefer ihr seit desto riesiger werden die Hölen und Verzweigungen. Dies möchte ich auch ändern aber egal was ich mache es bleibt ein riesigeges Hölensystem oder es werden sehr kleine Einbuchtungen. Zur Performance wird noch ein Lichtsystem eingeführt was nochmehr fps frisst. Steuerung: A D/Links Rechts Leertaste/Springen LMT/Platzieren RMT/Löschen MRO MRU/ebene wählen Shift+MRO MRU/Block wählen.

    So jetzt mal die Fragen zur übersicht:
    Wie verbessere ich die Performance?
    Wie kann ich das Hölensystem verbessern?
    Wie kann ich die Fehler beseitigen?

    PS:Ich wusste jetzt nicht genau in welches Thema es passt...
    Dateien
    • Minecraft 2d.zip

      (347,16 kB, 491 mal heruntergeladen, zuletzt: )

  • Das mit de Objekten hast du recht gut gelöst. (Kollissionen anhand des Grids erkennen.)

    Ich glaube eher dass das Problem an dem riesigen Array liegt.
    1.000 x 1.000 = 1000000 Elemente.

    Ein Array ist ja dazu da um viele Datenelemente zu Speicher, jedoch sollte man da nicht übertreiben. Im Taskmanager habe ich eine auslastung von 115.000 KB gelesen (bei deinem Spiel).
    Das ist einfach eine zu große Speicherauslastung für den GM. (Zumindest war es bei mir so als die Spiele solch einen Speicher reserviert habe...)

    Du musst also entweder kleinere Arrays nehmen (= kleinere Map) oder du schaust ob du in ein kleineres Array die ganze Map noch irgendwie unterbringen kannst. (ob das aber auch den nötigen Performanceschwung mitsichrbringt...)

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

  • Vorweg: Du wirst einen großteil deines Codes umschreiben müssen, aber das ist ja vollkommen normal :D

    Im Grunde sind hier 2 Tipps. Bitte alles was du nicht kennst in der GM Hilfe nachschauen.

    Tipp 1: GM Interne Datenstrukturen

    Also das Problem ist nicht der Speicherverbrauch, oder die Größe des Arrays sondern vielmehr, dass Arrays benutzt werden. hier mal aus der Hilfe:

    list schrieb:

    Lists can be used in many ways, for example to store changing collections of values. They are implemented using simple arrays but, as this is done in compiled code it is a lot faster than using an array yourself.

    Heisst so viel wie: Benutze vordefinierte Datenstrukturen. Der GM bietet einige davon wie: maps, lists, grids, queues, stacks, priority.

    Für ein Spielfeld empfielt sich entweder Maps (ds_map) oder Grids (ds_grid).

    Ich würde Grid nehmen weil das gleichzeitig eine Vielzahl von Funktionen mitbringt.


    Nun zu deinem Problem: Du hast die Welt in 3 zwei-dimensionale Arrays gespeichert. Lösbar wäre das mit Grid, dort kannst du eine x eine y Position und ein value speichern.
    Die x, y Koordinaten repräsentieren natürlich diene Spielwelt wieder. Interessant ist "value".

    Value ist im grunde nur ein einziger Wert. Allerdings wird dieser immer als String behandelt. Du kannst dort alle drei Ebenen abspeichern.

    Beispiel:

    Deine Spiel hat 1000 verschiedene Mmöglichkeiten den Hintergrund anzeigen zu lassen, auf 3 Ebenen. Pro Feld muss also 3x diese 1000 Möglichkeiten gespeichert werden.

    Feldnummer x=890, y=745
    Ebene 1 = 234 (z.B. Kohle)
    Ebene 2 = 99
    Ebene 3 = 0

    von ds_grid_add könnte das x=890, y=745, val="234099000" sein.

    Aber was ist 234099000? Das sind einfach deine drei Ebenen hintereinander weggeschrieben mit der Bedingung, dass immer auf 3 Stellen aufgefüllt wird: 234 099 000
    Das bringt dir den Vorteil, dass du beim Auslesen einfach durch die String Methoden zum zerlegen eines String die ersten 3 Zeichen für die Identifizierung der Ebene 1, die Zeichen 4-6 für Ebene 2 und die Zeichen 7-9 für Ebene 3 rauspickst.

    Somit hast du deine gesamte Spielwelt in diesen ds_grid untergebracht inklusive Informationen deiner 3 Ebenen.
    Damit vermeidest du einfach, dass du 3 verschiedene Arrays gehst. Hier hast du im grunde nur 1 Array.


    Tipp 2: Tiles statt draw_sprite

    Das bringt die größere Änderung mit sich.

    Der GM bietet für Hintergrundgrafiken Tiles an. Die sind schneller als gezeichnete Sprites. Zu finden in der Hilfe unter "Tiles".

    Bei Tiles musst du allerdings etwas aufpassen, denn diese müssen nur einmal gezeichnet werden. Sie sind langsamer als Sprites wenn sie in jedem Schritt gezeichnet werden aber schneller wenn du sie einmal zeichnen lässt und das Spiel dafür sorgt, dass sie im Hintergrund auftauchen.
    Deswegen darfst du nur alle Tiles Neuzeichnen (oder schau mal wie sich die tile_layer_shift Methode verhält die sollte besser sein) wenn sich der Spieler bewegt bzw. so viel weiterbewegt dass es sich lohnt eine neue Reihe von Tiles (bzw. Nlöcke bei dir) zu zeichnen.

    Wichtig 2: Tiles bieten die Funktion für mehrere "depths" also Layer an. Benutze bei deinem Minecraft Klon nur eine einzige Layerstufe und überprüfe anstatt alle 3 auf einmal zu zeichnen ob z.B. Ebene 1 ein existiert, wenn ja zeichne die als Tile und Ignoriere die anderen beiden Ebenen. Gibt es sie nicht, dann benutze Ebene 2 und überprüfe dort und so weiter.
    Verschiedene depths sind dafür da, falls du durchsichtige Baumkronen oder ähnliches hast und dahinter z.B. Gras möchtest. In deinem Fall also nicht wichtig.


    Das sollten eigentlich ein paar Änderungen sein um deinen Kopf rauchen zu lassen und etwas bessere Performance zu bringen. Ich hoffe ich konnte helfen.
    Falls du mit deinem Generator nicht zufrieden bist, das ist eine Wissenschaft für sich. Kein Generator ist gleich da musst du einfach selbst viel herumprobieren wobei Nachdenken meist mehr hilft.