Haradirki.de

Optimierung:
Beispielmap: optimierung.vmf

Hier wollen wir uns mit der Optimierung von Maps beschäftigen. Mit der Optimierung solltest du dich schon möglichst vor dem Bau deiner Map beschäftigen. Zumindest solltest du dir überlegen, wie du deine Map baust. Denn im Nachhinein deine Map zu optimieren ist sehr schwierig. Speziell den Punkt Sichtbarkeit kannst du nur mit starkem Eingriff in die Map zu beheben.

Wenn du deine Map schon gebaut hast und du im Nachhinein die Map optimieren willst, sollest du auf jeden Fall dir zuerst den Artikel über "Performance analysieren" durchlesen. Hier erfährst du, wie man überhaupt erkennt, was in der Map denn so an der Performance zieht und was nicht. Nacher bastelst du sonst an einer Stelle, wo du meinst sie wäre für Performance-Einbrüche verantwortlich, doch später stellt sich heraus, dass sich absolut nichts geändert hat. Daher zu erst den Artikel lesen, das spart Frust!

 

Sichtbarkeit:

Wenn du deine Map fertig hast und nun den Befehl mat_wireframe eingibst und du wirklich die ganze Map sehen kannst, hast du ein großes Problem. Wie eben schon angesprochen, ist dies wirklich nur mit hohem Aufwand zu beheben. Speziell solche Maps, die nicht verwinkelt sind machen hier große Probleme. Hier bleibt dir nicht viel übrig, als ggf. deine Map wirklich neu zu überdenken. Hier wäre der Einsatz von Visblockern notwendig:

Beispiel:Bei Maps, die ganze Stadtviertel darstellen, kannst du verschiedene "Räume" erstellen, die durch Gebäude als "Wände" voneinander abgrenzen. Stell dir einfach vor, du musst von einem Straßenzug durch eine Unterführung laufen, um in einen anderen Straßenzug zu kommen. Diese beiden Straßenzüge wären nun 2 Räume, die Unterführung (das ist unser Visblocker) einfach ein Verbindungsweg. Wenn du hier nun die Unterführung etwas verwinkelt baust, kasst du hier schon viel Performance herausholen:

Tipp 1: Du erstellst einfach eine Trennwand mitten in einem Raum. Das kann, wenn man den Raum von weitem sehen kann, schon einiges bringen. Diesen Brush nennt man Donut-Brush:

Tipp 2 : Abhilfe können dir auch Hint und areaportal sein.

Tipp 3: Nehmen wir an, du baust eine Stadtmap. Nun hast du Probleme mit der Skybox, denn du willst ja deine Stadt nicht einfach in den Wolken oder vom Meer umschlossen haben. Also errichtest du einfach weitere Straßenzüge. Diese clipst du nun ab, so dass der Spieler dort nicht hingehen kann. Diese Technik ist FALSCH. Du solltest dazu eine 3D-Skybox verwenden. Diese ist besser für die Performance und auch die Compile-Zeit dauert nicht so lange.

 

Brushwork:

Gutes Brushwork ist das A und das O in jeder Map. Wenn in deiner Map Brushs übereinander liegen und dadurch z-Fighting entsteht, kann dies schwere Folgen für deine Map haben. Auch vom Einsatz von Carve und Hollow solltest du absehen. Wenn du jeden Brush sorgfältig selbst mappst, passieren dir viele Fehler viel seltener.

Niemals die ganze Map in eine große Box einhüllen: Dies ist ein Fehler, der gerne von Anfängern gemacht wird. Sobald du dies tust, kann es vorkommen dass deine ganzen Vorkehrungen für die Performance nicht mehr funktionieren und die ganze Map im mat_wireframe Modus sichtbar ist. Dazu liest du dir am besten den Abschnitt über Skyboxen durch.

Keine zu großen Brushs einsetzen: Ich habe schon Maps gesehen, wo mehrere Räume einen gemeinsamen Bodenbrush hatten. Dies ist für die Performance wirklich übel. Du solltest das sofort entfernen und in jedem Raum einen eigenen Boden erstellen, da sonst nämlich alle Räume zusammen von der Engine gerendert werden, obwohl du die Räume ja garnicht sehen kannst.

Brushs innerhalb der Map zu einem func_detail machen: Dies ist eine große Hilfe, denn nun muss vbsp.exe nichtmehr so viele Leaves berechnen und nun geht auch der Compile-Prozess schneller. Dadurch, dass nun weniger Leaves dargestellt werden müssen, steigt auch deine Performance. ACHTUNG: Nicht alle Brushs kannst du zu einem func_detail machen! Nur solche, die nicht direkt an den Void grenzen. Hier kennst du auch den Abschnitt über func_detail durchlesen.

Mit den Details variieren: Wenn du kleinere Bereiche baust, z.B. einzelne Räume, so kannst du diese natürlich mit vielen Details ausstatten. Sobald du nämlich den Raum verlässt, sollte er ja auch nicht mehr dargestellt werden. Anders ist es natürlich in Aussenarealen. Da der Spieler sich recht lange in solchen Arealen aufhält, solltest du hier weniger Details einsetzen als in Räumen.

 

Hint:

Hint Brushs sind eine Hilfe für die Engine, denn sie geben vor, wo ein Leaf gesetzt wird. Es kommt leider sehr oft vor, dass vbsp.exe deine Map so in Leaves zerlegt, dass sich das sehr schlecht auf die Performance auswirkt. Die Engine berechnet immer das aktuelle Leaf in dem sich der Spieler befindet, aber auch alle Leafs, in die der Spieler (und das Leaf auch) sehen kann. Mit der Hinttextur lässt sich das Erstellen eines Leafs genau festlegen und auch somit Performance sparen. Sehen wir uns das an einem Beispiel an:

Hier siehst du einen Hint-Brush. Der komplette Brush ist dabei mit der Textur skip "tools/toolsskip" belegt, lediglich eine Seite (die sichtbare Seite im "Camera"Fenster ist mit der Hint Textur ("tools/toolshint") belegt:

Genau an der Seite des Brushs, an dem sich die Hinttextur befindet, erstellt die Engine ein neues Leaf. Nun zum Sinn des Ganzen. Wie du in der TOP-Ansicht sehen kannst, schneidet der Hintbrush die Ecke des Ganges genau, hier ist das Face (Seite des Brushs mit der Hinttextur) identisch mit der Sichtlinie eines Spielers, d.h. ab diesem Punkt kann der Spieler um die Ecke sehen, vorher jedoch nicht. Durch den Einsatz der Hinttextur wird hier ein Leaf erstellt, was der Engine dann genau sagt, ab wann welcher Teil des Ganges dargestellt wird. Hints lassen sich nicht nur an solchen Ecken einsetzen, sondern auch in Räumen selbst, so z.B. wenn du eine Trennwand hast, die nicht bis zur Decke geht. Wenn du hier an diese Trennwand angrenzend einen Brush bis zur Decke erstellst, diesen dann mit der Skip-Textur belegst und nur an der Unterseite mit der Hint-Textur, dann kannst du so die beiden Raumteile "optisch teilen".

 

func_areaportal:

Ein func_portal ist ein brushbasierendes Entity. Du benötigst also zuerst einen Brush, um das Entity zu erstellen. Ausserdem gibt es eine spezielle Tools-Textur, die Textur "tools/toolsareaportal". Ein func_areaportal erstellt man innerhalb einer Türe. Das func_areaportal sagt dann der Engine, wann die Türe geschlossen ist und der Raum dahinter nichtmehr berechnet werden muss.


Hier kannst du schön sehen, wie das func_areaportal genau mittig in der Türe sitzt.

Beispiel: Dazu erstellst du einen Brush der genau so groß ist, wie die Türe auch. Dann belegst du den Brush mit der Textur "tools/toolsareaportal". Nun gehst du im Menü auf "Tools" und dort auf "Tie to Entity". Hier wählst du "func_areaportal". Nun drückst du gleich "ALT" + "ENTER", denn hier wollen wir ein paar Dinge einstellen:

  • Key "name of Linked Door":
    Value: "door_01"
  • Key "initial state"
    Value: "closed"

Diese beiden Punkte sind besonders wichtig. Daher erkläre ich sie dir gleich. "Name of Linked Door" ist von der Funktionsweise her dem key "Parent" identisch. Das func_areaportal folgt also immer dem "name of linked door", also der Türe mit dem Namen "door_01". Dementsprechend musst du der Türe auch den Namen "door_01" geben, sonst kommt es zum HOM-Effekt sobald du die Türe öffnen willst.

Initial State gibt an, ob das Areaportal offen oder geschlossen sein soll. Wir wählen natürlich geschlossen, da die Türe ja auch geschlossen ist. Betrachten wir nun die Wirkung eines func_areaportal:


Hier im Bild ist die Türe und das Areaportal geschlossen (closed). Wie du siehst, wird hinter der Türe nichts mehr dargestellt.

 


Hier im Bild ist die Türe und das Areaportal offen (open). Nun kann der Spieler den Raum sehen und nun wird auch der Raum berechnet. Hast du noch Fragen zu Areaportalen? Dies ist nur ein kleiner Teil eines ganzen Themas. Das ganze Thema Areaportals findest du hier.

 

func_detail:

Du solltest jeden Brush, der nicht an den Void grenzt, zu einem func_detail machen. Das hat den Vorteil, dass er bei der Erstellung der Leafs nicht mitberechnet wird. Besonders mehrseitige Brushs (Zylinder) eignen sich hervorragend dazu, zu einem func_detail umgewandelt zu werden, denn sie erzeugen sehr viele Leafs, wenn man sie nicht zu einem func_detail macht. Im ersten Teil der Beispielmap siehst du in den Gängen jeweils 3 Zylinder. Alle sind zu func_detail gemacht. Wenn du die Map mit GLVIEW compilierst, siehst du, dass sie keine Leafs erzeugen.

Allgemein lässt sich also folgendes sagen: Alle Brushs, die direkt ans "nichts" bzw. an den Void grenzen, sollte man nicht zu einem func_detail machen, da sonst die Map nicht abgedichtet ist und es zu einem Leak kommt. Aber alle Brushs, die sich in deiner Map befinden, also z.B. Treppengeländer, Treppenstufen, Säulen etc. solltest du zu func_detail machen.

 

3D-Skybox:

Die 3D-Skybox ist eine sehr nützliche Sache, um einfach und ohne großen Rechenaufwand eine Skybox zu erstellen. Du kannst hier ebenfalls ganze Häuserblocks usw. in die 3D-Skybox einbauen. Du musst nur darauf achten, dass die 3D-Skybox 1/16 ihrer normalen Größe haben muss, da die Engine alle Brushs in der 3D-Skybox um das 16-fache vergrößert in der Skybox darstellt.

Diese Methode ist auf jeden Fall besser, als weitere Straßen zu erstellen und diese dann mit der Textur "tools/toolsclip" abzuclippen, so dass der Spieler nicht in diese Straßen laufen kann. Technisch betrachtet funktioniert das auch, jedoch ist es für die Engine viel mehr Aufwand als eine 3D-Skybox.

 

Skybox:

Auch bei Skyboxen kann oder besser sollte man einiges berücksichtigen. Eine Skybox sollte man immer so bauen, dass sie nur Teil eines Raumes ist. Sobald eine Skybox ganze Teile bzw. die ganze Map umhüllt, ist das für die Performance sehr schlecht. Hier habe ich mal 3 Skyboxen erstellt:

skybox ganz schlecht
Dies ist warscheinlich die schlechteste Wahl, wie man seine Skybox baut. Sie umschliesst die ganze Map, sogar an der Unterseite. Lediglich ein "schwebener Boden" wurde gebaut. Auf diese Bauweise solltest du auf jeden Fall verzichten!

 

Skybox schlecht
Hier ist es schon "etwas" besser. Es gibt einen richtigen Boden, d.h. die Skybox geht nicht unter der Map weiter. Dennoch umschliesst auch hier die Skybox noch die ganze Map. Dadurch muss auch alles von der Engine berechnet werden. Daher ist auch diese Bauweise sehr ungeschickt.

 

Skybox ok

Hier ist die Skybox genau so angesetzt, dass man von der Straße aus immer den Himmel über sich hat, jedoch jeder Teil der Skybox einen "Raum" abschliesst. Dennoch ist auch diese Skybox nicht ganz perfekt. Sobald man nämlich einen Teil der Map höher baut als den Rest, kann man diesen durch die Skybox hindurch sehen. Dies sieht meist sehr unschön aus. Daher solltest du möglichst gleich hohe Gebäude in deiner Map einbauen.

Optimale Skybox: Natürlich stellt sich die Frage, wie man eine Skybox optimal baut. Am besten immer so, dass die Bereiche mit der Skybox möglichst klein sind um die Engine nicht allzusehr zu belasten. Da auch Aussenareale mit einer Skybox als "Raum" zählen, da sie eben auch Wände haben, die eben mit der Skybox-Textur belegt sind, kann man diese auch als einen Raum behandeln. Wer ein paar VIS-Blocker einbaut, z.B. eine Unterführung mit einem 90°-Winkel darin, oder einen U-Bahn-Schacht etc. kann so die Sicht auf ein Aussenareal beschränken. So spart man am meisten Performance.

Generell solltest du einfach mal z.B. den Singleplayer von Half Life 2 ansehen. Hier gibt es in den Aussenarealen recht wenig Details. Sobald du große Flächen hast, solltest du auch den Detailgrad etwas herunter schrauben.

 

func_Occluders:

Der Einsatz von fun_occluders will weise gewählt sein, denn dieser Effekt wird von der Engine in dem Moment berechnet, indem er benötigt wird. Im Gegensatz zum func_areaportal lässt ein func_occluder NUR Models verschwinden, also KEINE Brushs und auch keine Schatten. Daher solltest du schon viele Models auf einem Fleck haben die dann durch den Einsatz des func_occluders verschwinden. Du solltest immer mittels +showbudget nachsehen, ob sich der Einsatz des func_occluders rentiert .Wenn nicht, löschst du ihn am besten. Occluders sollten nur so eingesetzt werden, das sie Performance einsparen und nicht, um die Performance zu verschlechtern.

 

 

zurück zur Hauptseite

Half-Life 2 Hammer Tutorial, Copyright (c) 2005 Dirk "Haradirki" Marmann, erstellt mit Wordpad

Dieses Tutorial ist grundsätzlich Freeware und darf für den persönlichen Gebrauch weiterkopiert werden. Es darf allerdings NICHT ohne meine Einverständniss auf anderen Homepages als HTML-Datei oder zum Download angeboten werden. Es darf nichts hinzugefügt, verändert oder gelöscht werden. Weiterhin darf es nicht auf digitalen Medien, z.B. CD-Medien veröffentlicht werden, wenn ich nicht ausdrücklich meine Einverständniss dazu gegeben habe. Alle Rechte bleiben beim Autoren. Wird aus diesem Tutorial zitiert, währe ich sehr dankbar, wenn ihr dabei auf eine meiner beiden Homepages http://www.haradirki.de oder http://www.dead-in-bed.net hinweisst.

 

http://www.haradirki.de   http://www.dead-in-bed.net