3D für alle – Optimierung

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

    • 3D für alle – Optimierung


      3D für alle – Optimierung

      Diesen Artikel gibt es auch als PDF .


      Oft beobachtet man Projekte mit 3D, die aufgrund von mangelnder Performance aufgegeben werden. Und auch Projekte, die bei den meisten gut laufen, tun das nicht überall.
      Performance optimieren geht immer. Auch wenn die vorhandene bereits ausreicht, so gibt einem ein noch flüssiger laufendes Spiel mehr Möglichkeiten und Spielraum für neue Effekte.





      Modelle optimieren, Part1



      Seit den neuesten Updates des GM8.1 werden Modelle anderes behandelt, zum Vorteil der Performance. Doch werden die meisten beim Update keine großen Unterschiede bemerkt haben, wobei der Vergleich von YYG einen heftigen Boost um den Faktor 50:1 vorwies.
      Um zu verstehen, wieso das nicht auf sein eigenes Spiel in dem Grad zutrifft, muss man verstehen, was sich geändert hat.
      Früher, da gab es Modelle. Diese konnte man laufend im Drawevent mit d3d_primitive_* oder zu anderen Zeitpunkten mit d3d_model_primitive_* erstellen. Modelle können auch aus Dateien geladen werden.
      Nun, was alle diese gemein haben ist, dass die Informationen die so ein Modell enthält, also Form, Texturkoordinaten, Normalvektoren und Weitere, jeden Step in den VRAM geladen werden. Der VRAM ist der Speicher der Grafikkarte. Dieser enthält alles, was gerade so auf dem Bildschirm benötigt wird. Dies können Texturen sein, aber auch 3D Modelle.
      Der Nachteil davon, dass der GM die Modelle jeden Step in den VRAM lädt, ist, dass dies Dauert.
      Und jetzt kommt der Vorteil der Erneuerungen. Es gibt die Möglichkeit, Modelle nicht jeden Step in den VRAM laden zu müssen. Dadurch spart man sich die Wartezeit, die auf die Geschwindigkeit des Spieles drückt.
      Natürlich werden weiterhin jeden Step ein paar Daten an die Grafikkarte gesendet. Dies sind aber nur Informationen wie die Position des Modelles, ob es Beleuchtet werden soll und welche Textur es haben soll. Diese Informationen sind aber recht übersichtlich, und von der Datenmenge nicht mit denen eines ganzen Modelles zu vergleichen.
      Die einzige Ausnahme sind die d3d_primitive_*, die sogenannten dynamischen Modelle, da diese sich jeden Step neu definieren. Der Gegensatz sind die statischen Modelle, also der ganze Rest. Diese werde ja nur einmal erstellt und dann in den VRAM geladen.

      Aber warum ist mein Spiel jetzt nicht so schnell, wie ich es erhofft hatte?

      Dafür gibt es mehrere Gründe. Zu optimieren gilt es also:


      1.) So wenig wie möglich
      d3d_primitive_* nutzen. Mach lieber mehrere statische Modelle, statt dynamische zu nutzten.
      2.) Modelle einmal erstellen. Finger weg vom Erstellen von Modellen in Events, die regelmäßig aufgerufen werden. Am besten beraten ist man, wenn man die Modelle im Create Event eines Objektes, das das ganze Spiel hindurch existiert, erstellt oder lädt. Alle anderen Objekte die diese Modelle nutzen wollen, nutzen diese. Also
      d3d_draw(obj_control.model_world);.
      3.) Große Modelle nutzen. Das soll nicht heißen, dass man seine Modelle detaillierter machen soll, sondern, dass man mehrere zusammenschließen sollte. Wer also eine Landschaft mit Gebäuden, Bäumen und sonstigen Elementen hat, sollte nach Möglichkeit diese zu einem, großen Modell „verschmelzen“. Dadurch spart man an den beschriebenen, restlichen Daten, die weiterhin jeden Step gesendet werden.





      Modelle optimieren, Part2


      Dieser Abschnitt gilt für alle, auch Nutzer von älteren GameMaker Versionen.
      Modelle, das sollte man wissen, bestehen aus 3Ecken. Viele 3Ecke, die zusammenhängen, oder auch nicht, und somit eine Form beschreiben. Je mehr von den sogenannten Vertices, des so schlechter die Performance, ganz einfach.
      Aber oft werden schlicht und ergreifend zu viele Vertices benutzt. Mit ein bisschen Geschick bekommt man seine Formen auch hin, ohne wahnsinnig viele Vertices zu benutzten. Wenn man mal genau auf andere Spiele achtet, muss man feststellen, dass die Modelle teilweise recht grob sind. Dies fällt einem als Spieler bloß nicht unmittelbar auf, da dies oft gut getarnt wird. Detaillierte texturen und sonstige schwuschbusch Effekte tuen ihrs.

      Welche Möglichkeiten habe ich da jetzt?

      Folgendes sollte man beachteten:

      1.) Schon bei der Erstellung von Modellen genau und penibel auf jeden Vertex achten. Muss da wirklich einer sein, wo sowieso unmittelbar niemand hinguckt?
      2.) Software Optimierung. Es gibt Software da draußen, die deine Modelle automatisch Optimiert. Ich würde jetzt gerne was verlinken, aber die zu nutzende Software hängt ganz stark davon ab, welche Programme und Formate man bei der Erstellung der Modelle nutzt. Stichwörter wie „Mesh optimizer“ sollten helfen.
      3.) Muss etwas rundes wirklich rund sein? Nein, das muss es bei weitem nicht. Entweder man nutzt Billboards (nächster Punkt) oder macht es einfach gröber. Muss dieser Turm jetzt aus mehr als 6 Seiten bestehen? Oder dieses Rohr aus mehr als 3? Nein, eigentlich nicht. Eine Textur, die einen weichen Schatten simuliert und für dieses Modell deaktiviertes Licht helfen ungemein zu übersehen, wie simpel das alles ist.
      4.) Billboards sind Flächen, meist also 2 Vertices, die sich immer Richtung Kamera neigen. Somit erhält man die Illusion, da würde eine Kugel durch den Raum schweben, oder Wasser irgendwo rumplätschern, ohne, dass es richtige, 3 Dimensionale Objekte sind.
      5.) Muss es denn immer wirklich ein Modell sein? Nein, natürlich nicht. Denkt kreativ, wenn es darum geht, wie man seine Sachen zeigen kann. Z.B., ein Zaun, der weiter weg ist, oder einfach nicht genauestens inspiziert werden kann, muss ja nicht mehr als eine Wand mit entsprechender Textur sein.




      Texturen


      Der wohl größte Fehler sind die Texturen. Nicht, dass einige dessen zwingende Quadratigkeit und festen Größen ignorieren, sondern, dass wenn die mal zu groß werden, pusten sie nicht nur die Exe ungemein auf, sondern auch die gute Performance weg. Warum? Weil!
      Eine 256x256 Textur, die in den meisten Fällen völlig genügend ist, lässt die Exe gleich 262kb mehr wiegen. Und da es keine Komprimierung gibt, wächst dieser Wert auch proportional mit der Textur. Im Quadrat. 512x512 sind da dann schon mal ein MB. 1024x1024 folglich 4mb.
      Große Texturen haben auch sehr großen Einfluss auf die Performance des Spieles.
      Für den, der gerade sitzt und sich seine Texturen zusammenschustert gilt also, diese klein zu halten. Natürlich kann man nicht einfach seine 1024x1024 Texturen runter skalieren. Denn kleine Texturen erfordern auch, dass man mal scharfe Kanten einbaut, Details hervorhebt und die wenige Pixel die man hat, auch optimal ausnutzt.




      Aufpassen mit Fog


      Fog ist im GameMaker, und das ist ein Fehler der meisten, nicht zur Performanceoptimierung, sondern nur aus Schönheitsgründen. Auch wenn der Nebel an ist, rendert der Render alles im Umkreis von 32000 um die Kamera herum, auch wenn der Fog auf 200 steht. Dies kann unter Umständen zum Performanceverlust im großen Stil führen.

      Und was mache ich jetzt dadran?


      Statt d3d_set_projection() zu nutzten, sollte man von d3d_set_projection_ext() gebrauch machen. Dort gibt es einen Parameter, der sich zfar nennt. Diesen gilt es auf die Weite des Fogs zu stellen. Falls es dann Probleme mit einer eventuellen Skybox gibt, sollte man den Wert natürlich auf die Entfernung dieser einstellen.




      Antialiasing


      Yeay, es gibt Antialiasing, also nur rein damit, das gute Stück. Oder?
      Nun, folgendes gilt nicht nur für Antialiasing, sondern auch für andere Späßchen und Effekte.
      Macht es optional. Lass dem Benutzer entscheiden, ob er Partikel, Kantenglättung und Lensflare gebrauchen kann, und wenn, wie stark und wie viel. Und damit der Benutzer nicht im Haufen der Einstellungen ertrinkt, macht doch auch noch gleich Profile, vordefinierte Einstellungssets.




      Culling


      Überall wird den Anfängern geraten, die Finger von Culling zu lassen, da dies zu merkartigen Fehlern führt, die den armen Frischling die Suppe versalzen. Dabei ist Culling äußerst praktisch, man muss es nur verstehen.
      Jeder Vertex hat 2 Seiten. Ist ja auch wie ein 3Eckiges Stück Papier. Es gibt da eine Vorderseite und eine Rückseite. Beim Erstellen der Modelle sollte man daher dringlichst darauf achten, dass die Vorderseite nach außen zeigt, und die Rückseite nach innen. Denn was Culling macht ist, ein Vertex nur zu bearbeiten, wenn dessen Vorderseite zur Kamera zeigt. Der Vorteil: ca. die Hälfte der Vertices müssen gar nicht erst behandelt werden, werden ignoriert.
      Der Nachteil liegt natürlich auf der Hand. Ein schlampig gearbeitetes Modell kann nicht mit Culling gedrawt werden, da dann teile plötzlich unsichtbar werden. In einigen Fällen ist Culling natürlich sowieso nicht angebracht. Wenn man z.B. eine Wand hat, die von 2 Seiten betrachtet werden kann, würde nur die eine gezeichnet werden.




      Slowputer


      Nun muss man ja gestehen, dass der durchschnittliche Computer aller User hier auf gm-d.de deutlich über dem der Rest der Bevölkerung und wohl auch eurer Zielgruppe liegt. Euer Spiel kann noch so toll sein, wenn er aber nur auf euren Computern läuft, nützt das alles nicht viel.
      Wer sich als besonderer Sünder empfindet, kann ich nur empfehlen seinen GameMaker, Projekte und Ressourcen auf einen alten PC umzulagern. Einmal unter grottigen Bedingungen zu programmieren würde den meisten wohl ungemein helfen. Plötzlich findet man unzählige Fehler, meist in der Planung und Strukturierung des Projektes, und lernt kostbares und unbezahlbares hinzu. Ich kann es nur empfehlen.





      Wer sich jetzt nicht von dieser Wand an Text erschlagen fühlt, Gratulation, du hast es somit überstanden. Ich hoffe möglichst vielen die Augen geöffnet zu haben und hoffe auch auf bessere Spiele in der nächsten Zeit. Denn, alles Performance die man sich irgendwo zusammenkratzen kann, kann man für neue, noch tollere Effekte einsetzten, die das Spiel noch schöner machen.

      Optimierung ist kein Einschnitt in eure Möglichkeiten und euer Projekt, sondern eröffnet weitere Möglichkeiten.

      MfG SDX

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von SDX ()

    • Super zusammenfassung!
      Auch wenn ich (noch) nicht mit den 3D Funktionen des GMs arbeite, so ist dieser Thread doch eine Motivation irgendetwas in 3D zu programmieren.
      Sei es nun eine Tech demo oder ein vollwertiges Spiel.

      Als beispiel: DAs mit dem culling wusste ich garnicht. Hab durch den Thread also was dazugelernt 8neben den Statischen und Dynamischen Modelle.)
      Weiter so! :thumbsup:
    • Witziger weise behandelt der ganze beitrag die auch von mir im letzten halben jahr gemachten erfahrungen im bereicht performance. Also stimme ich dem ganzen voll und ganz zu.Auch das mit dem alten rechner. Gerade 3d projekt teste ich vor her auf meine m Laptop der nur für unter wegs ist und daher nur 2,2 gig hat "celeron"
      Wenn da was nicht stimmt mekrt mann das gleich.
      Ach und auch wenn es evtl nichts mit der performance zu tun hat, erwähe doch bitte noch das Texturen immer quadratischs sein sollten. also 16x16, 32x32 usw. sonst gibt das fehler die wie bei mir nur auf anderen rechnern zu sehen sind.
      Meine Signatur hat kein Visum für das GM Forum erhalten.
    • Sehr schoen, SDX!
      Ich finde, der letzte Abschnitt ist ziemlich wichtig. Denn, hier, bei der gm-d.de, ist es mir noch nicht so aufgefallen, aber bei anderen Spielen im Netz, die mit dem Game Maker erstellt wurden, ist es oft so, dass sie auf etwas aelteren Rechnern anfangen zu laggen und das liegt meistens eben daran, dass man nur auf einem schnellen Rechner programmiert und testet und dabei viele Performanceprobleme nicht beachtet und auch nicht bemerkt. Dies gilt jetzt aber auch nicht nur fuer 3D-Spiele sondern auch fuer 2D-Games. Man sollte immer schauen was man in Events, die jeden Step ausgefuehrt werden, stehen hat und versuchen soviel performancefressenden Code wie moeglich in Events zu stecken, die nur ein einziges Mal aufgerufen werden.

      MfG Trixt0r

      Albert Einstein schrieb:

      Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
    • Okay... jetzt mal ganz langsam

      Hm... also ich verwende die Funktionen d3d_primitive_* nicht(sondern d3d_model_vertex_) und lasse die models als global_model in einem Objekt zu Beginn erstellen. Die Texturen sind maximal 256x256 und zfar ist bei niedriger Qualität auf 500... Warum ist der GM immer noch so langsam? Wenn ich das mal so durch rechne müsste doch Grafikqualität von Spielen um 2007 herum drin sein. Sogar die leicht langsamere Ultimate 3D Engine pakt das(Also, ich vergleiche die jetzt mit dem Würfel test von Mike). Warum dann nicht die neue GM-Engine?
      Oder ist das Update noch gar nicht raus? (Dein Post sagt zwar was anderes, kann aber sein... vllt... D: )
      Ich verstehs nicht...
      ._.


      EDIT: Jetzt hat upgedatet... jetzt -.-
      Sorry für den sinnfreien Post. Ja, also jetzt geht's... und es sieht geil aus ^^
      *Bedank*

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Mr. Diesel ()