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 ()