Kapitel 36 · Doom 3

MAPOPTIMIERUNG (TEIL 1)

Autor: Fragpoint
Downloads: Beispielmap 29, Beispiel abgeschrägte Brushes und Beispiel verwinkelte Gänge

Gleich vorweg: Hierbei handelt es sich mit Abstand um das längste Tutorial, das ich schreiben werde. Wer also keine Lust auf lange Textwüsten und sehr viele Bilder hat, sollte am besten fluchtartig diesen Thread verlassen ;) Es gibt für die Optimierung verschiedene Punkte, auf die Ihr bei Eurer Map achten solltet. Zunächst wollen wir einmal darauf eingehen, wie man die Performance am leichtesten und zuverlässigsten messen kann.

FPS IM AUGE BEHALTEN

Eine nicht unwichtige Orientierungshilfe beim Feststellen der Perfomance Eurer Map ist die FPS-Anzeige (Bilder je Sekunde), die Ihr während des Spiels über folgenden Befehl einblenden lassen könnt:

com_showfps 1


Anschließend wird Euch die aktuelle Bildwiederholrate rechts oben in der Spielegrafik angezeigt:

image249.jpg

Um den Befehl wieder aufzuheben, also die FPS ausblenden zu lassen, gebt einfach den Befehl com_showfps 0 ein (0 = aus, 1 = an). Doch eines solltet Ihr unbedingt beachten: Die FPS-Anzeige ist ein rein subjektives Hilfsmittel. Denn die Anzahl der Bilder je Sekunde, die auf Eurem Monitor gezeigt werden, ist abhängig davon, wie schnell Euer Rechner ist oder in welcher Auflösung/Detailgrad Ihr gerade spielt. Ihr müsst immer davon ausgehen, dass andere Spieler langsamere Rechner haben, bei denen Eure Map vermutlich ruckeln wird. Doch wie kann man dann feststellen, wie gut die eigene Map optimiert ist? Das funktioniert über die so genannten r_speeds. Dazu solltet Ihr Euch den nächsten Punkt unbedingt durchlesen.

POLYGONE ZÄHLEN

Über einen einfachen Befehl könnt Ihr Euch darstellen lassen, wie viele Polygone (je Fläche zwei Stück) aktuell aus dem Blickwinkel des Spielers zu sehen sind. Gebt dazu folgenden Befehl ein:

r_showPrimitives 1


Dieser erste Befehl steht dafür, dass die aktuelle Anzahl der Polygone ausgegeben wird. Danach könnt Ihr in der Konsole jede Menge Zahlen sehen.

image250.jpg

Sobald wir jedoch die Konsole schließen, sind diese für uns nicht mehr sichtbar, was sehr ungünstig ist, denn wir wollen schließlich ständig sehen, wie viele Polygone gerade dargestellt werden. Deshalb geben wir noch folgenden Befehl ein:

con_noPrint 0


Der zweite Befehl gibt die Polygonzahl (und noch ein paar Werte mehr) während des Spiels auf dem Monitor aus und nicht nur in der Konsole. Wichtig sind die nachfolgend markierten Zahlenkolonnen (tris):

image251.jpg

Wenn man sich die Original Multiplayermaps von Doom 3 anschaut, kann man sehr leicht feststellen, dass dort im Schnitt 50-60.000 Polygone dargestellt werden. Also solltet Ihr unbedingt darauf achten, dass Ihr diesen Wert nicht überschreitet! Zwar können bei kurzen Abschnitten auch einmal höhere Werte auftreten, aber insgesamt sollten in der restlichen Map Werte von unter 60.000 Polygonen erzielt werden.
Bereiche mit hohen Polygonzahlen sollten übrigens nur in Teilen Eurer Map auftreten, in denen keine HotSpots - also Plätze an denen viel gekämpft wird - vorhanden sind. Bedenkt dabei nämlich, dass jede Spielfigur und jeder abgefeuerte Schuss, weitere Polygone hat und somit die Gesamtzahl noch mehr in die Höhe treibt. Auch die vom Spieler getragene Waffe und die Verwendung der Taschenlampe haben Einfluss auf die Anzahl der Polygone. Hier seht ihr übrigens einen Brush, dessen eine Oberfläche sich in 2 Polygone aufteilt:

image271.jpg

Im Laufe der nächsten Jahre werden sich diese Werte aber noch weiter erhöhen, weil immer leistungsfähigere Hardware zur Verfügung steht, die dann auch mehr Polygone gleichzeitig darstellen kann, ohne dass dies zu Performanceeinbrüchen führt.

CAULK-TEXTUR

Auf dieses Thema möchte ich nicht nochmals eingehen, da es bereits im letzten Tutorial ausführlich behandelt wurde. Ihr findet das Tutorial über folgenden Link: Caulk-Tutorial

SPARSAM MIT TEXTUREN

Natürlich sollen Eure Maps nicht eintönig werden, aber ihr solltet trotzdem sparsam mit den Texturen umgehen. D. h. ihr sollt nicht zu viele verschiedene für einen Raum nehmen. Fast alle Texturen in Doom 3 haben über den Shader eine Specular-, Normal- oder Heightmap zugeordnet bekommen, die unter Umständen echte Performancefresser sein können. Auch Texturen wie unser Spiegel schlucken jede Menge FPS. Ihr müsst bei Spiegeln bedenken, dass der Raum immer 2x berechnet werden muss, da er im Spiegel nochmals dargestellt wird.

BRUSH-BAUWEISE

Bisher habt Ihr von mir gelernt, dass man Brushes für Raumwände rechtwinklig aneinander setzt. Im Grunde ist diese Vorgehensweise nicht falsch, doch gibt es eine wesentlich sinnvollere - allerdings langsamere - Methode. Doch schauen wir uns erst einmal einen Raum von oben an, wie wir ihn bisher gebaut haben:

image252.jpg

Und nun einen Raum, wie er richtig geplant sein sollte (Brushes mit Edge verformt):

image253.jpg

Doch worin liegt der Vorteil dieser Methode? Schlicht und ergreifend in der Anzahl der Polygone, die die Engine darstellen muss. Schauen wir doch die normale (alte) Bauweise einfach mal von der Seite aus an:

image254.jpg

Gut zu erkennen ist, dass dort drei Flächen von der Engine dargestellt werden müssen. Je Fläche müssen jeweils zwei Polygone berechnet werden. In unserem Fall wären dies also 6 Polygone (3 Flächen x 2 Polygone). Nun schauen wir unsere neue Bauweise an:

image255.jpg

Wie Ihr seht, wird dort nur noch eine Fläche dargestellt. Insgesamt müssen also nur noch 2 Polygone berechnet und dargestellt werden. Das erspart der Engine jede Menge Rechenleistung. Zwar mag das bei einem einzelnen Raum nicht viel ausmachen, aber auf eine große Map mit vielen Details bezogen, kann dies schon große Vorteile bringen. Übrigens mappt man so nicht nur bei Außenwänden, sondern bei allen Arten von Konstruktionen, bei denen diese Abschrägungen möglich sind. Was das für uns bedeutet? Jede Menge Arbeit und Übung, indem wir die Beispielmap aus unserem letzten Tutorial an unsere neuen Erkenntnisse anpassen. Am besten mappt Ihr von Anfang an mit abgeschrägten Flächen, dann erspart Ihr Euch später jede Menge Arbeit. Falls euch die Bilder nicht ausreichen, habe ich eine extra Map-Datei mit dem Raum angehängt. Auch habe ich in unserer Beispielmap 29 versucht, alle Räume und Gänge entsprechend anzupassen, was Ihr zur Übung auch machen solltet.

VERWINKELTE GÄNGE

Verwinkelte Gänge, wie in unserer Beispielmap, erleichtern es der Engine, unseren Level abschnittsweise zu berechnen.

image264.jpg

Dies funktioniert im Zusammenhang mit den Vis-Portalen, die ich unter dem nächsten Punkt erläutern werde. Weitere Vorteile bestehen darin, dass die Monster nicht direkt auf den Spieler schauen können, sondern diesen erst sehen können, wenn er um die Ecke gebogen kommt.

image265.jpg

Das obenstehende Bild verdeutlicht Euch das sicher noch etwas besser. Auch hier habe ich eine entsprechende Map-Datei beigefügt, in der Ihr Euch die Konstruktion gesondert von der eigentlichen Beispielmap anschauen könnt.

Aufgrund der extremen Länge des Tutorials habe ich mich doch entschlossen, dieses zu splitten. Weiter geht es im Teil 2 ;)