Qualität/Geschwindigkeit Problem

  • GM 8

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

  • Qualität/Geschwindigkeit Problem

    Hallo

    Ich arbeite schon seit einiger Zeit mit Gamemaker.

    Nun wollte ich ein Spiel für meine landwirtschaftsverückten Freund erstellen,
    wo man mit einem Traktor ein Feld sähen und nach einiger zeit dann mit einem Mähdrescher ernten kann.

    Soweit die Theorie.

    Nun habe ich 2 Probleme

    1.Das Feld sind viele kleine 16 x 16 Pixel große Objekte.
    Dadurch sieht alles so viereckig unrealistisch aus.

    2.Wenn ich die Objekte kleiner mache sieht es schon besser aus,
    doch wegen der steigenden Anzahl der Objekte hängt der PC dann sehr.

    ich weiß dass ich alle Objekte außerhalb der Ansicht deaktivieren kann doch dadurch
    wird anscheinend auch der Alarm der das wachsen der saat steuert pausiert...

    Hat irgendwer Tipps?

    PS: Ich brauche kein fertigen Code, Tipps würden reichen.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Tipp 2: Du willst das die Aussteigend sind? Aber dein PC/laggt immer stimmts? Das liegt an deinen Graffikarte glaube ich. Mach es so wie ich, nimm die Objecte erst einmal ganz niedrig, wenn du später mit dem Object fertig wirst, oder nach deinem Spiel kannst du sie wieder Aussteigend machen, sodass es wieder gut aussieht. Bei mir laggt mein PC auch, wenn ich eine Graphik Hoch mache, aber es ist nunmal so.

    KKaaNNoo112233, 8)
  • Für jede Instance die gerade vorhanden ist muss sehr viel Code ausgeführt werden, das führt dazu das das Spiel ruckelt, der Game Maker ist für solche Belastungen nicht ausgelegt.


    @kaano123: Der Punkt dürfte der Prozessor sein, die Grafikkarte langweilt sich da (nicht nur die Grafikkarte viel schneller ist als der Prozessor). Desweitern hat "Lag" was mit Netzwerken zutun (Internet und so).


    Zurück zum Problem. Du könntest mit Tiles arbeiten und einem Grid indem du einträgst wo ein Feld ist oder wo nicht. Für jeden Pixel eine Instance ist aber nicht optimal und führt eben dazu das das Spiel ruckelt.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Währe es nicht auch möglich das das Feld nur 1 Objekt ist?
    Also so das es sich an den stellen wo man mit dem Saat Traktor rübergefahren ist sich umfährbt.
    Oder wäre das zu schwer/umständlich?
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Also um genauer zu seien:
    Es sind sogar 5 Felder.
    4 sind 17x30 Objekte groß
    das andere ist 40x30 Objekte groß
    Es ist also c.a. 2500 mal das Objekt feld.

    Noch ne Frage:
    Momentan ist lm Feld Objekt eine Aktion: Collison mit SaatTraktor
    Sprite wechseln
    Alarm starten

    Würde es etwas bringen die Aktion zu entfernen aber dafür beim Saattraktor diese Aktion einzufügen:
    Collison mit Feld:

    for other Objekt sprite wechseln
    for other Objekt Alarm starten

    ich glaube dann wird die Collison nur 1 mal statt 2500 mal geprüft.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Larsi schrieb:

    Also um genauer zu seien:
    Es sind sogar 5 Felder.
    4 sind 17x30 Objekte groß
    das andere ist 40x30 Objekte groß
    Es ist also c.a. 2500 mal das Objekt feld.

    Noch ne Frage:
    Momentan ist lm Feld Objekt eine Aktion: Collison mit SaatTraktor
    Sprite wechseln
    Alarm starten

    Würde es etwas bringen die Aktion zu entfernen aber dafür beim Saattraktor diese Aktion einzufügen:
    Collison mit Feld:

    for other Objekt sprite wechseln
    for other Objekt Alarm starten

    ich glaube dann wird die Collison nur 1 mal statt 2500 mal geprüft.
    Ich würde erstmal alle Objekte außerhalb der View (ich hoffe du benutzt eine!) deaktivieren.
    Das würde schonmal viel verbessern.
    Und dein Code kannst du dann ja mal testen.
  • Ich würde erstmal alle Objekte außerhalb der View (ich hoffe du benutzt eine!) deaktivieren.
    Das hat er ja vorhin geschrieben, dass er die Funktion zum Deaktivieren kennt. Dadurch wird das Wachstum der Saat gestoppt.

    Du könntest, wie henrik1235 erwähnt hat mit Tiles und ds_grid arbeiten. Wenn du damit noch nicht vertraut bist wäre das eine gute Möglichkeit sich das Wissen anzueignen :). Für beides gibt es genug Themen im Forum und in der Hilfe. Tiles sind nämlich deutlich schneller, weil sie keinen Code, außer den Koordinaten beinhalten.

    Die Grid-Funktionen (ds_grid) sind etwas komplizierter, aber wenn man es mal verstanden hat, kann man super damit arbeiten.
    Ein Grid erstellt ein Zahlenraster, wobei jede Zahl für ein anderes Tile stehen könnte.
    Natürlich ist dann noch die Herausforderung, die Tiles ersetzen zu lassen (z.B. wenn die Saat gewachsen ist).

    Was man auch machen könnte, ist (wenn man die instance_deactivate-Funktionen benutzt) das Wachstum von einer externen Zeitvariable (zum Beispiel in einem unsichtbaren Controller-Objekt) steuern zu lassen. Dafür bräuchte man allerdings, wenn man es exakt machen will, für jedes kleine Feld eine Variable - 2-dimensionale Arrays eignen sich hierfür sehr gut - oder eben ds_grid, was nichts anderes ist als eine Array mit erweiterten Funktionen.

    Ich hoffe ich konnte helfen. :)
  • Wie rlp wchon geschrieben hat, kann man auch eine "born" Zeit nehmen. Und wenn diese wieder aktiviert werden, kann man mit der aktuellen Zeit vergleichen und dementsprechend handeln. Ich hatte so ein System beim meinen (leider ins Datennirvana verschwundene "Survival Adventure" damit wurden das Wachstum der Beeren gesteuert.

    Für ein DS-Grid Tutorial kannst du dir die verschiedenen Inventory Tutorials anschauen. Die meisten bauen darauf auf.
  • Danke für den tipp mit der Zeit.

    Mein controlobjekt zählt langsam ein variable hoch die sich das Feld merkt und vergleicht. Funktioniert Super

    Doch irgendwie funktioniert das deaktivieren außerhalb des Views nicht das Feld ist immer unsichtbar = deaktiveirt

    Hier der Code vom Controlobjekt

    //Step

    if Maher.f =1 { //Hat der Maher einen Fahrer?

    view_xview[0]=Maher.x-300
    view_yview[0]=Maher.y-200

    }

    if Saat.f =1 { //Oder der Säher

    view_xview[0]=Saat.x-300
    view_yview[0]=Saat.y-200

    }

    instance_deactivate_all(1)
    instance_activate_region(view_xview[0]-300,view_yview[0]-200,600,400,1)
    instance_activate_object(Saat)
    instance_activate_object(Maher)


    PS: Mein view ist 600 breit und 400 hoch.
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D
  • Dein Code ...
    instance_deactivate_all(1)
    instance_activate_region(view_xview[0]-300,view_yview[0]-200,600,400,1)
    instance_activate_object(Saat)
    instance_activate_object(Maher)
    ... fragt den Viewbereich um 300 Pixel zu weit nach links und um 200 Pixel zu weit nach oben ab. Wenn du das so beibehalten willst, dann müsstest du width und height der Abfrage anpassen, da jetzt nur bis zur Bildschirmmitte abgefragt wird.

    Probier mal:

    GML-Quellcode

    1. instance_deactivate_all(1)
    2. instance_activate_region(view_xview[0],view_yview[0],view_xview[0]+view_wview[0],view_yview[0]+view_hview[0],1)
    3. instance_activate_object(Saat)
    4. instance_activate_object(Maher)

    view_wview gibt exakt die Viewbreite wieder und view_hview die Höhe der View.