Mapping & Hammer

GMod Map optimieren: mehr FPS durch saubere Sichtbarkeit

GMod Map optimieren: Visleafs und PVS verstehen, func_detail, Hint/Skip, Areaportals, Occluder und Fade-Distanzen einsetzen und im Spiel messen.

Eine GMod-Map läuft flüssig, wenn die Engine pro Bild möglichst wenig zeichnen muss. Den größten Hebel hat die Sichtbarkeit: einfache World-Brushes als Sichtblocker, Details als func_detail, Areaportals an Engstellen und Fade-Distanzen für Props. Danach misst du im Spiel, statt zu raten.

Wie die Engine entscheidet, was gezeichnet wird

Beim Kompilieren zerlegt VBSP den Innenraum der Map in Visleafs, also konvexe Raumstücke. VVIS berechnet anschließend für jedes Leaf, welche anderen Leafs von dort aus zu sehen sein könnten. Diese Liste heißt PVS (Potentially Visible Set).

Im Spiel bestimmt die Engine, in welchem Leaf die Kamera steht, und zeichnet nur, was in den Leafs des zugehörigen PVS liegt und im Blickfeld ist. Zwei Folgen sind wichtig:

  • Die Sichtbarkeit gilt pro Leaf, nicht pro Standpunkt. Kann irgendeine Stelle eines Leafs in ein anderes hineinsehen, gilt dessen ganzer Inhalt als sichtbar.
  • Nur World-Brushes blockieren die Sicht. Brush-Entities, func_detail, Displacements und Props tun das nicht, auch wenn man nicht hindurchsehen kann.

Gute Optimierung beginnt deshalb beim Grundriss: Räume, Ecken und versetzte Durchgänge trennen Bereiche voneinander. Eine einzige große Halle kann kein Werkzeug nachträglich retten.

func_detail: Details aus der Sichtberechnung nehmen

Jeder World-Brush schneidet Leafs. Viele kleine Brushes erzeugen viele kleine Leafs und Portale, was den Compile verlängert und die Sichtbarkeit unübersichtlich macht. Alles, was keine Bereiche voneinander trennt, markierst du deshalb und wandelst es mit Ctrl+T in func_detail um: Säulen, Stufen, Rahmen, Zierleisten, Möbel aus Brushes.

Als Faustregel gilt: Wände, Böden und Decken, die Räume abschließen, bleiben World-Brushes. Der Rest wird Detail. Beachte dabei, dass func_detail die Map nicht abdichtet. Eine Außenwand als Detail führt zu einem Leak. Wenn dein Compile bei VVIS hängt, hilft der Artikel VVIS dauert ewig.

Hint und Skip: Leafs gezielt schneiden

Manchmal schneidet VBSP ungünstig, etwa an einer Flurecke, sodass ein Leaf um die Ecke reicht und dadurch viel zu viel sieht. Mit einem Hint-Brush legst du die Schnittebene selbst fest:

  1. Erstelle einen Brush und belege alle Flächen mit tools/toolsskip.
  2. Belege genau die Fläche, an der geschnitten werden soll, mit tools/toolshint.
  3. Platziere den Brush so, dass die Hint-Fläche zum Beispiel diagonal durch die Ecke verläuft.

Setze Hints sparsam ein. Jeder zusätzliche Schnitt erzeugt neue Leafs und Portale. Ob ein Hint etwas bringt, siehst du in Hammer über Map > Load Portal File, das die Leaf-Grenzen im Editor einblendet.

Areaportals und Occluder

Ein func_areaportal ist ein dünner Brush mit der Textur tools/toolsareaportal, der eine Öffnung wie eine Tür oder ein Fenster vollständig ausfüllt. Er wirkt auf zwei Arten:

  • Offen: Die Engine zeichnet vom Bereich dahinter nur, was durch die Öffnung tatsächlich zu sehen ist. Das trifft auch Props und andere Entities.
  • Geschlossen: Der Bereich dahinter wird gar nicht gezeichnet. Du kannst das Portal mit einer Tür verknüpfen, damit es sich mit ihr öffnet und schließt.

Areaportals teilen die Map in Bereiche. Alle Verbindungen zwischen zwei Bereichen müssen mit Portalen verschlossen sein, sonst meldet der Compile ein Leck am Areaportal. Für Fenster, die man nur aus der Nähe einsehen kann, gibt es func_areaportalwindow, das den Bereich ab einer Entfernung ausblendet.

Im offenen Gelände, wo keine Wände trennen, hilft func_occluder. Er verbirgt Models, die vollständig hinter ihm liegen, aber keine Brush-Geometrie. Die verdeckenden Flächen erhalten tools/toolsoccluder, alle übrigen tools/toolsnodraw. Occluder kosten selbst Rechenzeit und lohnen sich nur, wenn eine große Fläche viele Props verdeckt.

Props, Lightmaps und unsichtbare Flächen

  • Fade-Distanzen: Props besitzen die Eigenschaften „Start Fade Dist“ und „End Fade Dist“ (bei prop_static heißen sie „Start Fade Dist/Pixels“ und „End Fade Dist/Pixels“). Kleine Objekte wie Flaschen oder Schilder müssen aus großer Entfernung nicht gezeichnet werden. Je kleiner das Prop, desto früher darf es verschwinden.
  • Der richtige Prop-Typ: Was sich nie bewegt, wird prop_static. Physik-Props belasten auf einem vollen Server zusätzlich Physik und Netzwerk.
  • Lightmap Scale: Der Standardwert ist 16. Auf großen, gleichmäßig beleuchteten Flächen sparen Werte wie 32 oder 64 Speicher und Dateigröße. Kleinere Werte setzt du nur dort ein, wo Schatten scharf sein sollen. Mehr dazu in Source Engine Beleuchtung.
  • Nodraw: Flächen, die niemand je sieht, bekommen tools/toolsnodraw. Das betrifft Rückseiten, Flächen unter Displacements und Stellen, die von Props verdeckt werden. Flächen, die ins Leere außerhalb der Map zeigen, entfernt VBSP von selbst.
  • Ferne Kulisse: Landschaft in der Ferne gehört in eine 3D-Skybox, nicht als echte Geometrie in die Map.

Im Spiel messen statt raten

Teste mit einem vollständigen Compile. Mit schnellem VVIS zeichnet die Engine mehr als nötig, die Werte sind dann nicht aussagekräftig. In GMod sind mat_wireframe, mat_leafvis, r_DrawPortals und r_lockpvs cheat-geschützt und brauchen sv_cheats 1, cl_showfps und +showbudget nicht.

BefehlWas er zeigt
cl_showfps 1Bildrate
+showbudgetAufteilung der Rechenzeit pro Bild, etwa auf World, Props und Physik. Mit -showbudget blendest du die Anzeige wieder aus
mat_wireframe 1Alles Gezeichnete als Drahtgitter, auch hinter Wänden. So siehst du, was die Engine trotz Wand rendert
mat_leafvis 1Umriss des Visleafs, in dem die Kamera steht
r_DrawPortals 1Umrisse der Areaportals
r_lockpvs 1Friert die Sichtbarkeit ein, damit du herumlaufen und prüfen kannst, was vom alten Standpunkt aus gezeichnet wurde

Gehe systematisch vor: Suche zuerst die Stellen mit der niedrigsten Bildrate, sieh dort mit mat_wireframe 1 nach, was unnötig gezeichnet wird, und setze erst dann gezielt Hints, Areaportals oder Fade-Distanzen. Zeigt das Compile-Log dabei Warnungen, die du nicht einordnen kannst, schlägt der Map Scanner zu bekannten Meldungen Ursachen und Lösungswege vor.

Häufige Fragen

Bringt func_detail wirklich mehr FPS?

Direkt verkürzt func_detail vor allem den Compile. Im Spiel ist der Gewinn kleiner: Die Map hat weniger Leafs, und die Flächen der World-Brushes werden in weniger Stücke zerschnitten. Zu viel Detail schadet aber: Was als func_detail markiert ist, blockiert keine Sicht mehr.

Warum ist meine Map trotz VVIS langsam?

Häufig ist der Grundriss zu offen, sodass von fast überall fast alles sichtbar ist. Weitere Ursachen sind sehr viele Props ohne Fade-Distanz, aufwendiges Wasser oder dynamische Lichter. Mit +showbudget siehst du, welcher Bereich die Zeit verbraucht.

Blockieren Displacements die Sicht?

Nein. Displacements dichten weder die Map ab noch blockieren sie die Sichtbarkeit. Lege unter Hügel und hinter Felswände einfache World-Brushes mit tools/toolsnodraw, wenn dahinter ein anderer Bereich beginnt.

Wo sind Areaportals sinnvoll?

An Engstellen zwischen Bereichen mit viel Inhalt, also an Türen, Fenstern und Durchgängen. In einer weiten, offenen Fläche bringen sie wenig, weil durch die Öffnung ohnehin fast alles zu sehen ist.