On enchaîne maintenant avec un autre aspect de l'optimisation très très important... On va y étudier le fonctionnement du moteur de Half-Life.
Ne négligez surtout pas ce passage car vous y apprendrez des connaissances in-dis-pen-sables à la compréhension des r_speeds.
Rappelons-nous. Que fait HLvis ? Il détermine les blocs qui sont calculés ou pas par le moteur de Half-Life... C'est très important, car si vous vous trouvez à un bout de votre map, vous n'allez quand même pas devoir calculer la position des polygones situés à l'autre bout puisque vous ne les voyez pas !!!
Le travail de HLvis a pour but de dire à Half-Life : "A cet endroit, on va calculer ces polygones et pas ceux-là".
Moins on calcule de polygones, plus le calcul de l'image va vite... et donc, en jouant sur votre map on aura des fps élevées (images par seconde).
Plus les fps sont élevées, moins votre map risque de "ramer". Car c'est bien là le problème : Half-Life est un vieux jeu, mais il peut sans problème faire ramer une carte graphique récente si vous n'y prenez pas garde !
Jusque-là, tout irait bien. Sauf que, la plupart du temps, HLvis va "supposer" que le joueur peut voir certains polygones alors que ce n'est pas le cas. Half-Life va donc faire un travail inutile en calculant des blocs que l'on ne voit pas...
Et ça, c'est très agaçant pour le mappeur, même si ce mappeur est un habitué de Worldcraft. Half-Life calcule trop de polygones pour rien...
Prenons un exemple typique assez impressionnant. Dans une de mes maps, je me trouve à l'intérieur d'une maison derrière la porte d'entrée qui est fermée... Je vois ceci :
Tout simple : des murs, un plafond, des escaliers... bref, peu de blocs sont calculés à priori.
Je vais vous prouver qu'en fait, Half-Life calcule 50 fois plus de blocs que ça (et je n'exagère pas) !
Pour cela, tapez dans la console la commande suivante :
gl_wireframe 2
Je vous rappelle que cette commande ne fonctionne que si vous avez lancé votre map en mode "Solo" et que vous êtes en OpenGL...
Le mode gl_wireframe 2 est encore plus avancé que celui que nous avons étudié tout à l'heure. Il affiche non seulement tous les polygones découpés et les flats, mais aussi TOUS les polygones calculés par le moteur (on les voit par transparence).
Voici donc tous les polygones que Half-Life calculait comme un fou alors que ça ne servait à rien :
Vous avez beau vous frotter les yeux, vous verrez bien la même chose : Half-Life calculait
entièrement la pièce qui se trouvait derrière la porte et qu'on ne voyait pas !
Ca fait un sacré paquet de polygones tout ça
Pourquoi, mais pourquoi Half-Life fait-il tous ces calculs inutiles ?
Il anticipe. En effet, la porte que vous voyez là est susceptible de s'ouvrir à n'importe quel moment, par vous ou par un autre joueur... Half-Life se tient prêt et calcule donc déjà les polygones qui se trouvent derrière.
Et si vous avez déjà fait connaissance avec les Leaks, vous savez que Half-Life a horreur de montrer du vide au joueur (c'est le pire cauchemar du mappeur ça, lol

)
Contre ce problème, il existe des solutions. Certaines sont préventives (ce sont celles que je préfère), d'autres sont assez bourrines (on force Half-Life à ne pas calculer des polygones, mais alors là gare aux bêtises !).
Les portals
Un portal est une information (et une seule) que HLvis a calculée. Cette information est destinée au moteur de Half-Life et lui indique quels polygones il doit calculer à un endroit précis de la map.
C'est au départ HLbsp qui, après avoir écrit le fichier *.bsp, se charge de transmettre un fichier d'informations sur la map à HLvis pour qu'il puisse faire les calculs nécessaires dessus.
Vous devriez d'ailleurs lire la ligne suivante :
BSP generation successful, writing portal file 'c:\maps\nom_de_la_map.prt'
C'est sur ce fichier *.prt que HLvis va travailler. Il va déterminer les portails (en anglais "portals").
Prenons l'exemple de ma map que vous avez vue tout à l'heure. Il y a un portal qui dit : "SI le joueur se trouve derrière la porte d'entrée, ALORS il faut caluler tous les polygones qui se trouvent dans la pièce derrière".
Il est intéressant de noter que les blocs ne sont pas calculés s'ils sont séparés du joueur par plus d'1 portal. Les entités-blocs tel que le func_wall ne sont pas calculées si elles sont séparées par au moins 2 portals.
Cela veut dire qu'il faut éviter de mettre beaucoup de func_wall parce qu'ils sont beaucoup plus souvent calculés que les blocs normaux. On aura l'occasion de reparler de tout ça...