Frame Rate niedrig

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

  • Frame Rate niedrig

    Hallo!

    Ich bin ganz frisch auf dem deutschsprachigen Forum, war vorher nur im englischen unterwegs.

    Ich verfolge seit gut einem Jahr ein recht ambitioniertes Projekt, einen Formel 1 Manager. Es geht gut voran, doch genau das ist vermutlich das Problem, denn meine Frame Rate geht mit jedem Tag (jedem Stückchen Code) weiter nach unten. Auf normaler Spielgeschwindigkeit ist das noch absolut akzeptabel (Min. FPS 38, Avr. 268), doch ich habe eine Zeitraffer Funktion, die das Renngeschehen auf bis zu 16-fache Geschwindigkeit erhöhen soll (ist so üblich bei solchen Games). Das ging bis vor einigen Wochen noch gut, doch jetzt schafft er kaum noch die 4x (er setzt die Zeitraffer Geschwindigkeit scheinbar einfach nicht um, damit die Frame Rate stabil bleibt).

    Ich hoffe ich werde nicht gesteinigt, da das natürlich eine sehr generelle Frage ist, doch ich habe die Suchfunktion benutzt und zum Teil nur 10 Jahre alte Threads gefunden.

    Die Anzahl der Objekte oder Grafiken kann nicht das Problem sein. Das Game ist in 2D und keinesfalls eine Schönheit. Die einzig animierten Grafiken sind Autos, die um den Kurs fahren und ab und zu mal eine Rain Animation. Das kann aber auch nicht das Problem sein, da sich an diesen Objekten in den vergangenen Monaten nichts geändert hat. Es muss am Code liegen. Und genau hier fehlen mir die Erfahrungswerte. Denn zu 98 % besteht mein insgesamt etwa 5.000 Zeilen langer Code aus simplen if Schleifen und zählenden Timern. Können die die Frame Rate auf Dauer tatsächlich so runterziehen? Ansonsten habe ich ein paar wenige Listen (Grid und Lists), die aber auch schon eine Weile drin sind und die Frame Rate zuvor auch nicht stark beeinflusst haben. Ansonsten gibt es 2 Rooms, ein paar Paths, einen einzigen Hintergrund und ein paar anklickbare Knöpfe. Scripts werden nicht geladen, auch Shader oder Extensions benutze ich aktuell nicht.

    Insgesamt geht es mir nur um ein paar Ratschläge und Erfahrungswerte, da es mir schwer fällt zu glauben, dass einige if-Schleifen die Performance so beeinträchtigen. Es wäre sehr schade, da ich das Projekt auf eine andere Engine übertragen müsste, was wochen- wenn nicht monatelange Arbeit bedeuten würde.


    Danke.
  • Ein paar allgemeine Sachen:
    Am meisten zieht das Drawevent mit all seinen Abkömmlingen an der Performance.
    Stelle die Hintergrundfarbe aus.
    Vllt. lieber

    GML-Quellcode

    1. ​mouse_in_rectangle
    nehmen als die integrierte Kollisionserkennung bei Button oder ähnlichen Elementen.

    Ein paar Fragen:
    Wie groß sind den die Sprites ungefähr von denen du sprichst?
    Wie ungefähr ist die Zeitrafferfunktion aufgebaut?
    Wie groß sind die Listen bzw. Grids?
    Wie ist das mit dem Regenfall genau gemacht?

    Interessante Links:
    Performance und Generator verbessern
    http://www.gm-d.de/wbb/index.php/Thread/22801-Draw-Event-und-Performance

    Sicher gibt es noch einige Tipps, die man hier vorbringen könnte, aber das wäre es erstmal von meiner Seite
  • Vielen Dank für die Antwort schon mal.

    Draw Events habe ich das ein oder andere, aber es werden nahezu ausschließlich Texte ge"drawed". Wie gesagt, die einzig beweglichen Elemente sind ein paar Autos auf der Strecke und anklickbare Knöpfe. Die Sprites sind sehr klein: Buttons sind im Regelfall 10x10 Pixel, die Autos liegen bei etwa 20x10 etc. Davon abgesehen gibt es nur noch ein Background Bild mit 1280x720.

    Die Zeitrafferfunktion ist sehr simpel. Ich multipliziere einfach den room_speed mit dem entsprechenden Faktor. Ist wahrscheinlich nicht die beste aller Lösungen, da auch die Frame Rate erhöht wird, aber als ich die Funktion programmiert habe, wusste ich mir nicht anders zu helfen.

    Es gibt 2 Listen, jeweils mit den Fahrern in die eine Achse und den Informationen (wie Rundenzeit, Position, Abstände etc.) in die andere Achse. Im Moment teste ich nur mit 3 Autos, sodass sie nicht größer als 3x12 Grid/Listenplätze sind

    Auch der Regen ist sehr simpel und die Frame Rate ändert sich kaum, wenn er einsetzt. Es ist einfach eine Grafik kleiner als der Background mit Transparenz Kanal (je nach dem ob es regnet oder nicht, wird die Grafik sichtbar bzw. bleibt unsichtbar).

    Ich entnehme deiner Aussage, dass die bloße Menge an Code und die if-Schleifen (selbst wenn es tausende sind) nicht das Problem sein können. Das wäre eine gute Nachricht für mich.

    Kollisionserkennung habe ich übrigens überhaupt keine.
  • Hast du dein Spiel mal an einem anderen Rechner ausprobiert?
    Benutzt du viele RAM lastige Sachen?
    Vll auch Do...loop schleifen die für Ärger sorgen?
    Wie hoch ist der eingestellte Room_Speed?

    Aus deiner Erklärung raus könnte es kaum an der Grafik selbst liegen. Zeichnest du die Kurse als Tileset? Oder alle elemente als Objekt?
    Gibt sovieles was die FPS nach unten ziehen kann.
  • Habe keinen anderen Rechner, nur den (i5 2500K bei 3,6 GHZ, 8 GB RAM, GeForce GTX 560). Außer dem Firefox habe ich so gut wie nie etwas im Hintergrund laufen, habe aber das schon getestet: Auch ein frisch gestarteter PC macht's nicht schneller. Keine Loop Schleifen oder ähnliche. Der Standard room_speed liegt bei 60, wird bis auf das 16x erhöht. Die Kurse liegen als simple Background Grafik vor.
  • Na, du kannst nicht erwarten das das ganze mit einem roomspeed von 960 (!) flüssig läuft. Denn dann wird (versucht) 960 mal die Sekunde deine 5000 Zeilen Code abzugehen. Dein ganzes Problem ist auf deiner Zeitraffer begründet. Leider hast du hierfür den falschen Ansatz gewählt und es könnte Zeitintensiv sein den Fehler zu beheben : An Stelle der Änderung des roomspeeds lässt du diesen bei 60 und multiplizierst stattdessen alle Werte mit deinem Faktor. Mit alles meine ich alles, also wenn du was wie counter -= 1; hast machst du counter -= 1*faktor; Wenn du im Auto speed = 4 hast : speed = 4*faktor ... usw. Hoffe du verstehst wie ich das meine. Auf diese Art und Weise kannst du die Performancekosten für die Zeitraffer eleminieren
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Oder du versucht nur die für die Simulation notwendigen Steps in jedem step mehrmals zu wiederholen.
    Aber Dinge wie Draw-Event und alle Buttons und so weiter werden dann nich 10 mal neu gemacht sondern eben nur einmal pro Step.
    So ein System musst du natürlich erstmal bauen. Sollte aber möglich sein (im Nachhinein vielleicht etwas trickey) und aufjedenfall ordentlich Performance geben.
    Aber den Room-Speed einfach hochzusetzen ist nie eine gute Idee und auch nicht die Feine Art.
    Sorm ist Schuld

    Edit: Doch ist er