VIS für Anfänger (Pflichtlektüre!)

Schlechte Performance? Map dauert lange zu kompilieren? Dann seid ihr hier wahrscheinlich richtig.

Wenn ich so in Foren unterwegs bin oder die Leute auf mich zu kommen und mich bitten, mal einen Blick auf ihre Map zu werfen, dann sind die Arbeiten eigentlich immer recht solide bis auf eine Sache: Die Geschichte mit VIS. Jeder, der eine halbwegs ordentliche Map umsetzen möchte, sollte sich zumindest mal mit diesen Basics beschäftigt haben. Es hat Einfluss auf eure Compile-Zeiten und spätere Ingame-Performance der Map. Da sich diese Anleitung primär an Einsteiger richtet, versuche ich das ganze so simpel wie möglich zu halten.

Was macht VIS überhaupt? Es ist eines der 3 Tools, welche man als "Compiler" bezeichnet. Es teilt die Map in sogenannte leaves (Singular: leaf!) ein und wertet anschliessend aus, welche leaves sich gegenseitig "sehen" können. Das ist insofern wichtig, damit die Source-Engine später weiss, welche Teile der Map gerendert werden sollen für den Spieler. Um den Begriff leaf etwas verständlicher zu machen: Man kann sich darunter eigentlich erstmal ein Volumen vorstellen. Die Form kann variieren. Tipp: Wer sich leaves in Aktion ansehen will, startet einfach eine beliebige Map, schaltet cheats ein und tippt mat_leafvis 1 in die Konsole. Dann wird das leaf, in dem man sich momentan befindet durch rote Linien angedeutet.

Nun jedoch mehr zur Leafeinteilung und der Sichtbarkeit (= Visibility). Dazu ein simples Beispiel. Ein Raum, in dem sich wiederrum zwei Räume befinden:

gfx/tutorials/vis_2room.png

Diese "Map" würde nach dem Durchlaufen von VIS irgendwie in folgende 5 leaves unterteilt werden:

gfx/tutorials/vis_2room_leaves.png

Weiterhin würde VIS festhalten, welche leaves sich "sehen" können. Leaf 1 zum Beispiel kann alle anderen sehen. Leaf 3 kann nur 5 und 1 sehen usw. Wie man sieht wird das bei einer grösseren Map und vielen leaves ziemlich schnell ziemlich komplex, aber diese Arbeit übernimmt zum Glück der Rechner für einen. Was ist also nun für denjenigen, der eine Map baut zu beachten? Eigentlich ist es nicht soviel, man sollte darauf achten, dass das Brushwork zumindest für VIS schön simpel bleibt. In dem Beispiel hat VIS kaum Arbeit. Aber wer baut schon mit so wenigen Details, sieht ja aus wie zu Half-Life 1 Zeiten. Fügen wir mal nur ein paar kleine Brushes als Detail in die Map ein. Eine simple Säule und drei Wandverzierungen:

gfx/tutorials/vis_2room_detail.png

Kompiliert man die Map, macht einem VIS daraus folgendes: (Vereinfacht! Wahrscheinlich würde es intelligenter aufteilen)

gfx/tutorials/vis_2room_detail_leaves.png

Wie man sieht, hat man durch Hinzufügen weniger Details seinen leafcount vervierfacht. Warum ist das so? Nun, für leaves gelten ähnliche Gesetze wie für Brushes: sie können nur konvex sein. Das heisst man kann z.B. kein "Loch" in einem Brush / Leaf haben, wie sicher einige beim Mappen schon festgestellt haben. Man muss dann eben entsprechende Brushes drumherum setzen, so dass ein "Loch" in der Mitte bleibt. Die 4-Eckige Säule sorgt also für 4 leaves. Stellt eucht vor, was eine Säule mit 32 Seiten anstellt. An dieser Stelle ebenfalls sehr wichtig: ähnlich wie die leaves zerschnitten werden, würde in diesem Fall auch Decke und Boden (sofern die Säule diese mit ihren Enden berührt) zerschnitten. In so einer kleinen Testmap hat das noch keine Auswirkungen, aber ab einer bestimmten Grösse von einer Map fällt es dann doch ins Gewicht und macht sich a) beim Compile bemerkbar. VIS sollte auf einem aktuellen PC nicht über 10-20s benötigen. Ist dem doch so, dann gibt es Stellen in der Map, an der VIS relativ lange "herumkaut". Stellt es euch ein bisschen wie die Arbeit eines Fliesenlegers vor: Ist der Raum ein Quader / Quadrat und alles ist schön gerade ist man mit dem Verlegen von Fliesen recht schnell fertig. Sind die Wände hingegen schief, enthalten Rundungen oder befinden sich Säulen in dem Raum usw muss man sehr viel Schneiden und es dauert entsprechend länger. b) macht es sich später im Spiel in den fps bemerkbar. Dabei sind es wohl die Zerschneidungen, die für unnötige Polygone sorgen.

Die Lösung für dieses Problem ist jedoch erstaunlich einfach und lautet: Entities.

Entities beeinflussen im Gegensatz zu worldbrushes die leafeinteilung nicht. Meistens werden Entities mit einer Funktion assoziiert - zum Beispiel ein func_rotating, func_door usw. Deswegen brauchen wir für diesen Zweck auch nur ein ganz einfaches: func_detail. Es hat, wie ihr im Editor festellen werdet keinerlei Optionen, eben nur diese, dass der oder die selektierten Brushes nun ein Entity sind. Auch die erwähnten Zerschneidungen bleiben dadurch aus, dazu ein Bild: (aufgenommen mit mat_wireframe 1)

gfx/tutorials/vis_novsfuncdetail.png

Wie man sieht, wird im ersten Bild der Boden zerschnitten, im zweiten nicht mehr. Hat man ein kleines Holzgerüst aus vielen kleinen Brushes sollte man dieses ebenfalls mit einem func_detail verknüpfen (nicht jeden Brush einzelnd). An dieser Stelle auch: Models sind ein Sonderfall, diese sind von der ganzen Thematik nicht betroffen (werden ja sowieso durch Entities erst in die Map eingebunden). Für Displacements gilt dasselbe. Ein weitere Tipp: Ob eine Map "vis-freundlich" ist, kann man im Editor sehr schnell herausfinden. Dazu einfach in dem VisGroup-Fensterchen alles bis auf die world geometry ausblenden, danach sollte die Map ganz simpel aufgebaut sein. Keine Rundungen, keine Details usw. sollten mehr zu sehen sein. Am besten einfach mal eine offizielle Map anschauen.

Noch ein weiterer Tipp: Versucht mit dem Brushwork (gerade die Wände) immer auf dem Grid im Editor zu bleiben. Entscheidet euch zu beginn in welchem Grid ihr die Wände baut, ob 8, 16 oder gar 32 Units ist eigentlich egal. Hauptsache man bleibt in und auf dem Grid, wenn man an dem Brushwork arbeitet. Ich sehe oft, dass das nicht mehr der Fall ist. Ein mal damit angefangen muss man ständig solche 1 Unit Abstände korrigieren, was auf Dauer echt nervig werden kann. Auch Lücken (-> Leaks) und Brushüberschneidungen kann man so vermeiden.

Das waren eigentlich schon die wichtigsten Punkte für Einsteiger zu dem Thema. Man kann das noch sehr viel weiter vertiefen. Da gibt es beispielsweise noch das kleine Tool Glview (Bei den neueren Engines geht es sogar noch einfach im Editor via Map -> Load Portal File), mit dem man alle leaves seiner Map betrachten kann, so kann man schnell sehen, an welcher Stelle viele kleine leaves auftauchen. Im Netz findet man auch noch weitere Anleitungen zur "Visibility Optimization". Man kann beispielsweise noch die Leafeinteilung durch Hint-Brushes beeinflussen. Dann wären da noch die Areaportals usw. Wer sein wissen weiter vertiefen möchte (nicht nur zum Thema VIS), der kann sich diesen Guide [EN] durchlesen. Wenn man all diese Techniken anwendet, kann man sich sicher sein, dass man zumindest maptechnisch eine solide Map gebaut hat.

Bei Fragen und Anregungen könnt ihr mich gerne kontaktieren.