Mapping et Hammer

Optimiser une map GMod : plus de FPS grâce à la visibilité

Optimiser une map GMod : comprendre visleafs et PVS, utiliser func_detail, hint/skip, areaportals, occluders et distances de fade, puis mesurer en jeu.

Une map GMod tourne de façon fluide quand le moteur a le moins possible à dessiner par image. C’est la visibilité qui offre le plus gros levier : des world brushes simples pour bloquer la vue, les détails en func_detail, des areaportals aux goulets d’étranglement et des distances de fade pour les props. Ensuite, tu mesures en jeu au lieu de deviner.

Comment le moteur décide quoi dessiner

À la compilation, VBSP divise l’intérieur de la map en visleafs, des portions d’espace convexes. VVIS calcule ensuite, pour chaque leaf, quels autres leafs pourraient être vus depuis celui-ci. Cette liste s’appelle le PVS (Potentially Visible Set).

En jeu, le moteur détermine dans quel leaf se trouve la caméra et ne dessine que ce qui se trouve dans les leafs de ce PVS et dans le champ de vision. Deux conséquences sont importantes :

  • La visibilité vaut par leaf, pas par position. Si un endroit quelconque d’un leaf peut voir dans un autre, tout le contenu de cet autre leaf compte comme visible.
  • Seuls les world brushes bloquent la visibilité. Les entités brush, func_detail, les displacements et les props ne la bloquent pas, même si tu ne peux pas voir à travers.

Une bonne optimisation commence donc par le layout : pièces, angles et ouvertures décalées séparent les zones les unes des autres. Aucun outil ne peut sauver après coup un unique hall gigantesque.

func_detail : sortir les détails du calcul de visibilité

Chaque world brush découpe des leafs. Beaucoup de petits brushes créent beaucoup de petits leafs et de portals, ce qui rallonge la compilation et rend la visibilité brouillonne. Sélectionne tout ce qui ne sépare pas des zones et transforme-le en func_detail avec Ctrl+T : piliers, marches, encadrements, moulures, meubles faits de brushes.

En règle générale, les murs, sols et plafonds qui ferment les pièces restent des world brushes. Le reste devient du détail. Garde en tête que func_detail ne rend pas la map étanche. Un mur extérieur fait de brushes de détail provoque un leak. Si ta compilation reste bloquée dans VVIS, va voir VVIS prend une éternité.

Hint et skip : découper les leafs volontairement

Parfois, VBSP découpe mal, par exemple à l’angle d’un couloir, de sorte qu’un leaf s’étend au-delà de l’angle et voit beaucoup trop. Un hint brush te permet de définir toi-même le plan de coupe :

  1. Crée un brush et applique tools/toolsskip sur toutes les faces.
  2. Applique tools/toolshint sur la face exacte où la coupe doit se faire.
  3. Positionne le brush de façon que la face hint traverse, par exemple, l’angle en diagonale.

Utilise les hints avec parcimonie. Chaque coupe supplémentaire crée de nouveaux leafs et portals. Tu peux vérifier si un hint est utile dans Hammer via Map > Load Portal File, qui affiche les limites des leafs dans l’éditeur.

Areaportals et occluders

Un func_areaportal est un brush fin portant la texture tools/toolsareaportal, qui remplit entièrement une ouverture comme une porte ou une fenêtre. Il agit de deux façons :

  • Ouvert : Le moteur ne dessine que la partie de la zone située derrière qui est réellement visible à travers l’ouverture. Cela vaut aussi pour les props et les autres entités.
  • Fermé : La zone située derrière n’est pas dessinée du tout. Tu peux lier le portal à une porte pour qu’il s’ouvre et se ferme avec elle.

Les areaportals divisent la map en zones. Toutes les liaisons entre deux zones doivent être fermées par des portals, sinon la compilation signale un leak au niveau de l’areaportal. Pour les fenêtres à travers lesquelles on ne regarde que de près, il existe func_areaportalwindow, qui masque la zone au-delà d’une certaine distance.

En terrain ouvert, là où aucun mur ne sépare quoi que ce soit, func_occluder est utile. Il masque les modèles entièrement cachés derrière lui, mais pas la géométrie en brushes. Les faces occultantes reçoivent tools/toolsoccluder, toutes les autres tools/toolsnodraw. Les occluders coûtent eux-mêmes du temps de calcul et ne sont rentables que lorsqu’une grande surface cache beaucoup de props.

Props, lightmaps et faces invisibles

  • Distances de fade : Les props ont les propriétés « Start Fade Dist » et « End Fade Dist » (sur prop_static, elles s’appellent « Start Fade Dist/Pixels » et « End Fade Dist/Pixels »). Les petits objets comme les bouteilles ou les panneaux n’ont pas à être dessinés de loin. Plus le prop est petit, plus il peut disparaître tôt.
  • Le bon type de prop : Tout ce qui ne bouge jamais devient un prop_static. Sur un serveur plein, les props physiques pèsent davantage sur la physique et le réseau.
  • Échelle des lightmaps : La valeur par défaut est 16. Sur de grandes surfaces éclairées uniformément, des valeurs comme 32 ou 64 économisent de la mémoire et de la taille de fichier. N’utilise des valeurs plus petites que là où les ombres doivent être nettes. Plus d’infos dans le guide de l’éclairage du Source Engine.
  • Nodraw : Les faces que personne ne verra jamais reçoivent tools/toolsnodraw. Cela concerne les faces arrière, les faces sous les displacements et les endroits recouverts par des props. Les faces tournées vers le vide à l’extérieur de la map sont supprimées automatiquement par VBSP.
  • Décor lointain : Les paysages éloignés ont leur place dans une skybox 3D, pas dans la map en tant que vraie géométrie.

Mesurer en jeu au lieu de deviner

Teste avec une compilation complète. Avec un VVIS en mode fast, le moteur dessine plus que nécessaire, donc les chiffres ne veulent pas dire grand-chose. Dans GMod, mat_wireframe, mat_leafvis, r_DrawPortals et r_lockpvs sont marquées comme cheats et nécessitent sv_cheats 1 ; cl_showfps et +showbudget non.

CommandeCe qu’elle montre
cl_showfps 1Le framerate
+showbudgetLa répartition du temps par image, par exemple entre le world, les props et la physique. -showbudget masque de nouveau le panneau
mat_wireframe 1Tout ce qui est dessiné, en fil de fer, même derrière les murs. On voit ainsi ce que le moteur affiche malgré un mur
mat_leafvis 1Le contour du visleaf dans lequel se trouve la caméra
r_DrawPortals 1Les contours des areaportals
r_lockpvs 1Fige la visibilité pour que tu puisses te déplacer et vérifier ce qui était dessiné depuis l’ancienne position

Procède avec méthode : repère d’abord les endroits où le framerate est le plus bas, examine-les avec mat_wireframe 1 pour voir ce qui est dessiné inutilement, et seulement ensuite place des hints, des areaportals ou des distances de fade de façon ciblée. Si, en chemin, le compile log affiche des avertissements que tu n’arrives pas à situer, le Map Scanner propose des causes et des solutions pour les messages connus.

Questions fréquentes

func_detail donne-t-il vraiment plus de FPS ?

Directement, func_detail raccourcit surtout la compilation. En jeu, le gain est plus modeste : la map compte moins de leafs, et les faces des world brushes sont découpées en moins de morceaux. Mais trop de détail nuit : tout ce qui est marqué func_detail ne bloque plus la visibilité.

Pourquoi ma map est-elle lente alors que VVIS a tourné ?

Souvent, le layout est trop ouvert, si bien que presque tout est visible depuis presque partout. Les autres causes sont un très grand nombre de props sans distances de fade, de l’eau coûteuse ou des lumières dynamiques. +showbudget montre quelle catégorie dévore le temps.

Les displacements bloquent-ils la visibilité ?

Non. Les displacements ne rendent pas la map étanche et ne bloquent pas la visibilité. Place des world brushes simples en tools/toolsnodraw sous les collines et derrière les parois rocheuses quand une autre zone commence derrière.

Où les areaportals sont-ils utiles ?

Aux goulets d’étranglement entre des zones riches en contenu, c’est-à-dire les portes, les fenêtres et les passages. Dans un vaste espace ouvert, ils n’apportent pas grand-chose, car presque tout est de toute façon visible à travers l’ouverture.