Kapitel 37 · Doom 3

MAPOPTIMIERUNG (TEIL 2)

Autor: Fragpoint
Downloads: Beispielmap 30 und Beispiel Vis-Portale

Also auf zum zweiten Teil unserer Optimierungs-Tutorials.

VIS-PORTALE

Ihr müsst dazu verstehen, dass die Doom3-Engine Eure Map in handlich kleine Bereiche zerlegt, so dass sie immer nur den Bereich darstellt, den der Spieler gerade einsehen kann. Würde die Engine nämlich ständig Eure gesamte Map auf einmal berechnen müssen, wäre vermutlich kein Rechner in der Lage, diese mit vernünftigen FPS darzustellen. Wie bereits erwähnt, erleichtert eine verwinkelte Bauweise der Engine diesen Vorgang. Damit diese jedoch weiß, wo die einzelnen Abschnitte beginnen, müssen wir diese markieren.

Nehmen wir dazu einmal den verwinkelten Gang aus unserer Beispielmap. Wir wollen erreichen, dass der Bereich nach dem Knick von der Engine erst berechnet wird, wenn er sichtbar wird. Dazu setzen wir vor diesem Bereich einen Brush, den wir komplett mit der Textur "common -> nodraw" belegen.

image266.jpg

Achtet unbedingt darauf, dass dieser neue Brush in die umgebenden Wände/Decken/Böden hineinschneidet. Es darf keine Lücke zurückbleiben, der Gang muss komplett "versiegelt" sein. Nachfolgend ein paar Beispiele wie man es nicht machen sollte (jeweils Draufsicht):

image267.jpg

Diesen Brush belegen wir nun entweder auf der Vorder- oder der Rückseite mit der Textur "editor -> vis_portal".

image269.jpg

Und schon ist unser Vis-Portal fertig. Damit man aus der anderen Richtung kommend den gleichen Effekt erreicht, setzen wir nach dem Knick einen weiteren Vis-Portal-Brush. Ebenso am Eingang und Ausgang unseres verwinkelten Ganges.

image268.jpg

Es funktioniert so, dass der momentan noch nicht einsehbare Abschnitt einige virtuelle Meter, bevor der Spieler auf das Vis-Portal blicken kann, von der Engine sozusagen vorgeladen bzw. vorberechnet wird, so dass dieser nicht plötzlich vor dem Spieler auftaucht, wenn er um die Ecke biegt. Ich habe hierzu noch einmal kurz einen Ausschnitt aus unserer Beispielmap (Draufsicht) farbig bearbeitet, so dass Ihr besser sehen könnt, wie die Portale funktionieren:

image270.jpg

So geht Ihr nun bei allen Euren Räumen und Gängen in der Beispielmap vor. Wie Ihr prüfen könnt, ob diese Portale funktionieren, seht ihr im nächsten Abschnitt.

R_SHOWTRIS ZUM PRÜFEN

Doch wie können wir überprüfen, ob unsere Vis-Portale auch richtig arbeiten? Dazu ist nur ein einfacher Befehl nötig. Gebt nach dem Mapstart folgenden Befehl in die Konsole ein:

r_showtris 3


Damit werden Euch alle derzeit von der Doom3-Engine dargestellten Oberflächen/Brushes/Objekte angezeigt. Mit r_showtris 0 schaltet ihr diese Darstellungsart wieder aus.

So sollte unser Raum mit funktionierenden Vis-Portalen aussehen:

image262.jpg

Der Gang endet dort unmittelbar beim Vis-Portal, was jede Menge Rechenleistung spart. Und so sieht der gleiche Gang ohne Vis-Portal aus:

image261.jpg

Beachtet dabei besonders, wie der Gang weiterführt und auch noch der weiter hinten erscheinenden Raum mit dem Pinky dargestellt wird. Dies belastet den Rechner sehr stark. Es gibt auch noch einen weiteren Befehl, mit dem Ihr prüfen könnt, ob die Vis-Portale funktionieren.

r_showPortals 1


Dort werden Euch die Vis-Portale als viereckige Umrandungen in den Farben rot und grün angezeigt (mit 0 deaktivieren).

image263.jpg

Rote Vierecke stehen für Vis-Portale, die derzeit noch geschlossen sind. D.h. die dahinterliegenden Räume werden von der Grafik-Engine derzeit noch nicht berechnet. Grüne Vierecke stehen dagegen für geöffnete Vis-Portale. D.h. die Räume, die dahinter liegen, werden derzeit von der Grafik-Engine bis zum nächsten Vis-Portal mitberechnet.

TÜREN VERWENDEN

Auch bei den Türen kommen wieder die bereits bekannten Vis-Portale zum Einsatz. Nur haben die Türen einen entscheidenden Vorteil: Der Raum der hinter der Tür liegt, wird erst berechnet, wenn der Spieler diese öffnet. Hier sehen wir eine geschlossene Tür bei aktivierten "r_showtris 3". Beachtet, dass auch die Objekte hinter der Tür (zum Beispiel die Leiter) mitberechnet werden:

image256.jpg

Um das zu verhindern, setzen wir nun innerhalb des Türbrushes ein Vis-Portal, das aber - wie bereits bekannt - sowohl in die Decken als auch in die Wände reinschneidet.

image258.jpg

Anschließend speichern wir unsere Map und schauen uns diese in Doom 3 an. Wie Ihr nun deutlich erkennen könnt, wird nur noch der aktuell sichtbare Raum berechnet. Alles was hinter der Tür liegt, wird nicht dargestellt:

image257.jpg

Also könnte man sich denken, dass man am besten in jedem Raum mindestens eine Türe mit Vis-Portal anbringt. Im Grunde ist das richtig gedacht, doch denkt daran, dass eine Türe den Spielfluss verschlechtert. Besonders in Multiplayer-Matches ist Schnelligkeit das A und O. Eine Türe wäre nur hinderlich, wenn man vom Gegner gehetzt wird und einem die Kugeln um die Ohren pfeifen. Dann will man nicht lange warten, bis sich die Tür öffnet. Deshalb geht sparsam mit dem Einsatz von Türen um.

LIGHTS SPARSAM EINSETZEN

Licht und Schatten sind die elementaren Bestandteile von Doom 3, ohne die das Spiel nur halb so gut aussehen würde. Die Schattenwürfe entstehen automatisch, sobald man die so genannten Lights (Lichter) setzt. Doch umso mehr Lichter Ihr in einen Raum setzt, umso mehr muss die Engine berechnen. Dies resultiert daraus, dass jeder Brush seinen eigenen Schatten wirft. Treffen nun aus verschiedenen Richtungen Lichtstrahlen auf ihn, wird er auch genauso viele verschieden starke/helle Schatten werfen. Da in einem Raum sehr häufig viele dutzend Brushes gleichzeitig vorkommen, kann man sich Belastung, die jedes einzelne Licht verursacht, sicher vorstellen. So sieht unser Raum momentan mit Beleuchtung aus:

image260.jpg

Doch auch das Licht selbst - wenn man die Schatten einmal außen vor lässt - belasten die CPU ungemein. Um das etwas besser zu veranschaulichen, wechseln wir kurz in Doom 3 und geben dort in der Konsole folgenden Befehl ein:

r_showlightcount 1


Wie Ihr seht, verwandelt sich Eure Wandtextur in ein buntes Farbmuster. Anhand dieser Farben könnt Ihr feststellen, wie viele Lichter gleichzeitig auf eine Oberfläche strahlen:

image259.jpg

Die Farbskala steht für folgende Werte (vgl. auch Freakmans Tutorial):

SCHWARZ = Dies zeigt an, dass auf diese Oberfläche kein Licht fällt. Aus dem Blickwinkel der Performance also ideal, leider aber unspielbar, da keiner etwas sieht.

ROT = Auf diese Oberfläche fällt ein einziges Licht. Dies würde ich persönlich als optimal bezeichnen.

GRÜN = Auf diese Oberfläche fällt das Licht von zwei Lights. Auch dieser Zustand kann ohne Bedenken akzeptiert werden. Mit Performanceeinbußen ist kaum zu rechnen.

BLAU = Diese Oberfläche wird von drei Lichtquellen beleuchtet. Hier ist also mit leichten Performanceproblemen zu rechnen. Ihr solltet Euch überlegen, ob Ihr nicht die eine oder andere Lichtquelle verschiebt oder ganz entfernt.

TÜRKIS = Auf diese Oberfläche fällt das Licht von vier oder mehr Lights. Dieser Zustand ist nicht akzeptabel und sollte unbedingt umgeändert werden. Versucht die Lichter zu verschieben oder ggf. eines zu löschen. Die Performance ist allerdings auch indirekt davon abhängig, wie groß der Raum ist, in dem dieser Effekt auftritt. Bei kleinen Räumen merkt man kaum etwas davon.

MAGENTA = Auf diese Oberfläche fällt das Licht von vier oder mehr Lights. Dieser Zustand ist nicht akzeptabel und sollte unbedingt umgeändert werden. Versucht die Lichter zu verschieben oder ggf. eines zu löschen. Die Performance ist allerdings auch indirekt davon abhängig, wie groß der Raum ist, in dem dieser Effekt auftritt. Bei kleinen Räumen merkt man kaum etwas davon.

WEISS = (Ja, die Schrift ist grau *g*) Auf diese Oberfläche fällt das Licht von vier oder mehr Lights. Dieser Zustand ist nicht akzeptabel und sollte unbedingt umgeändert werden. Versucht die Lichter zu verschieben oder ggf. eines zu löschen. Die Performance ist allerdings auch indirekt davon abhängig, wie groß der Raum ist, in dem dieser Effekt auftritt. Bei kleinen Räumen merkt man kaum etwas davon.

Natürlich hängt die Beleuchtung der Oberflächen auch noch von anderen Faktoren - außer der Position der Lichtquelle - ab. Auch auf die Stärke des Lichts kommt es an. Ein starkes Licht strahlt natürlich weiter und so läuft man Gefahr, dass es in den Bereich eines anderen Lights kommt.
Die Größe der Brushfläche ist jedoch auch ausschlaggend (Danke an Sheijan für den Tipp). Habt Ihr einen großen Brush - zum Beispiel bei einem langen Gang - treffen auf dessen Oberfläche vermutlich auch die Strahlen von mehreren Lichtquellen, so dass dieser eine türkise oder sogar weiße Farbe erhält. Dieses Problem könnt Ihr umgehen, indem ihr statt des einzelnen großen Brushes mehrere kleine baut.