This article's documentation is for the "GoldSrc" engine. Click here for more information.
This article's documentation is for anything that uses the Source engine. Click here for more information.

Fuite

From Valve Developer Community
Jump to navigation Jump to search
English (en)Deutsch (de)Español (es)Français (fr)Русский (ru)中文 (zh)Translate (Translate)
Info content.png
This page is being translated.
You can help by finishing the translation.
If this page cannot be translated for some reason, or is left untranslated for an extended period of time after this notice is posted, the page should be requested to be deleted.
Also, please make sure the article complies with the alternate languages guide.(en)

Les cartes .bsp(en) (Dans GoldSrc GoldSrc et Source Source) doivent être complètement fermées. Aucun élément intérieur du niveau, du monde, ne doit donner sur l'extérieur, le vide(en). Le ciel doit également être contenu dans un bloc utilisant la texture tools/toolsskybox (cf. skybox(en)). Dès qu'il existe une légère ouverture sur le vide, une fuite(en) (leak en anglais) est générée lorsque la carte est compilée via QBSP2(en)/HLBSP(en) ou VBSP(en). Lorsqu'une fuite apparaît, le compilateur BSP ne peut pas savoir quel élément est à l'intérieur ou à l'extérieur, ce qui fait que cela ne fonctionnera pas correctement.

Dans cet exemple, on constate un trou béant dans la géométrie débouchant sur le vide. Ceci provoquera une message d'erreur de fuite lors de la compilation.

Un trou dans la géométrie, qui débouche sur le vide, provoquera une fuite.

Lors de la compilation d'une carte comme celle-ci, avec une ouverture sur le vide, VBSP générera une erreur similaire à la trace ci-dessous :

ProcessBlock_Thread: 0...1...2...3...4...5...6...7...8...9...10 (0)
**** leaked ****
Entity light (-1607.69 -1094.12 -183.00) leaked!

Dans HLBSP(en) (ZHLT(en)/VHLT(en)), cela générera l'erreur suivante:

Warning: === LEAK in hull 0 ===
Entity info_player_start @ (  -0, 832, 128)
Error: 
  A LEAK is a hole in the map, where the inside of it is exposed to the
(unwanted) outside region.  The entity listed in the error is just a helpful
indication of where the beginning of the leak pointfile starts, so the
beginning of the line can be quickly found and traced to until reaching the
outside. Unless this entity is accidentally on the outside of the map, it
probably should not be deleted.  Some complex rotating objects entities need
their origins outside the map.  To deal with these, just enclose the origin
brush with a solid world brush

Leak pointfile generated

Avec ce message d'erreur, VBSP vous indique qu'il existe une fuite sur le niveau, ainsi que la première entité trouvée débouchant sur le vide (dans notre exemple, l'entité de lumière). Cela vous renseigne sur l'emplacement de cette entité, exprimée en coordonnées sur le monde (x, y, z).

Note.pngNote:La plupart du temps l'entité mentionnée n'est pas la cause de la fuite, il s'agit plutôt de l'objet qui déclenche la fuite. Supprimer cet objet ne fera que reporter une nouvelle erreur à partir d'un autre objet, cela ne resoudra pas votre problème ! Il existe un cas de figure qui supprimera la fuite: lorsque l'objet est situé en dehors de la zone jouable. Ce sujet sera abordé plus tard.
Note.pngNote:Si vous n'avez aucune entité point sur votre carte au moment de la compilation, VBSP VBSP indiquera une fuite, car il n'y a aucun moyen de savoir, entre l'intérieur et l'extérieur, laquelle est la zone jouable.
Note.pngNote:VVIS VVIS ne pourra pas s'exécuter s'il existe une fuite; (depuis Alien Swarm Alien Swarm) ainsi que Hammer++, cela arrêtera le processus de compilation. Cela n'apparaîtra pas lors de la prévisualisation des cartes dans Portal 2 Puzzle Maker(en), sans raison particulière.
Note.pngNote:ZHLT(en) & VHLT(en) - HLVIS(en) et HLRAD(en) refusera de démarrer s'il existe une fuite.
Note.pngNote:Dans Portal 2 Portal 2, Counter-Strike: Global Offensive Counter-Strike: Global Offensive et Alien Swarm Alien Swarm, si vous avez une fuite et que vous passez outre VVIS VVIS, la carte ne compilera pas le ciel.[Clarify]
Note.pngNote:Si l'eau(en) apparaît comme non dessinée, cela est probablement du à une fuite.

Conséquences des fuites

Une fuite dans un niveau a des effets négatifs. VBSP(en) indiquera la fuite et cela généra un fichier portail incorrect (mapname.prt(en)), voir aucun fichier. Le fichier portail est utilisé par VVIS(en) pour faire ses calculs de visibilité. Puisqu'il n'y a pas de fichier portail, VVIS(en) ne s'exécutera pas correctement voir pas du tout. Lorsque cela arrive, VRAD(en) ne fonctionnera pas non plus correctement, ou uniquement l'éclairage direct - sans rebonds de lumières.

Les cartes ne sont pas du tout jouables. VVIS(en) va demander au moteur de générer la carte en une seule fois, ce qui est trop mauvais pour la fréquence d'images, ou il y aura des zones complètement invisibles. Au pire des cas, une fuite peut faire que VRAD(en) généra une carte entièrement noire.

Perte de temps avec les fuites

VBSP(en) remontera toutes les fuites qu'il constate, mais passer des heures à faire des compilations et d'exécution en jeu pour se rendre compte que la carte est corrompie après compilation, n'est tout simplement très efficient. Assurez vous que votre carte n'a pas de fuite avant que vous vous préoccupiez de la visibilité et de l'éclairage. Si vous remarquez que VBSP(en) remonte une fuite pendant que la compilation s'exécute, appuyez sur Ctrl+C pour abandonner l'exécution.

Trouver les fuites

Parfois les coquilles ne sont pas aussi évidentes que dans l'exemple précédent. Ils peuvent être une petite fraction d'une unité de largeur et provoquer une fuite. VBSP(en) fournit un pointfile(en) pour vous aider à localiser la fuite. Il dessine une ligne à partir du vide de la carte jusqu'à l'entité qu'il a trouvé lors du contrôle de fuites. Après avoir reçu une erreur de fuite, un fichier mapname.lin(en) sera créé dans le même répertoire que votre fichier .vmf(en).

Charger un pointfile

Le pointfile(en) peut être chargé dans l'éditeur Hammer pour montrer précisément où se trouve la fuite dans le niveau. Pour charger un pointfile(en) du niveau, aller dans Load Pointfile(en) du menu Map.

La commande Load Pointfile affiche le chemin de la fuite dans les fenêtres d'affichage de Hammer.

Cette image montre le pointfile(en) chargé dans l'exemple précédent. Remarquez que la ligne rouge apparait à la fois dans la vue 3D et la vue 2D, et affiche une trace depuis l'entité à travers la brèche.

En utilisant cette aide visuelle, vous pouvez trouver l'origine d'une fuite en suivant la ligne rouge jusqu'à l'extérieur du niveau. Le mieux est de démarrer depuis l'entité spécifiée par VBSP(en), et de suivre la ligne jusqu'à trouver la brèche dans la géométrie. Comblez la brèche et recompilez le niveau si vous avez résolu la fuite.

Trouver l'extrémité

Si vous avez des difficultés à trouver l'entité de départ, vous pouvez utiliser la commande Go to Coordinates(en) du menu View pour trouver l'entité et le début de ligne pointfile(en). Entrez juste les coordonnées fournies par l'entité, et les vues 2D et 3D seront centrées sur celles-ci. Suivez ensuite la ligne jusqu'à la fuite.

Une autre méthode consite à trouver la source de la fuite en dézoomant dans une des vues 2D. Après avoir chargé le pointfile(en), dézoomez jusqu'à voir la ligne rouge. Suivez la ligne jusqu'à atteindre l'entité à son extrémité. Sélectionnez l'entité et utilisez Center 3D Views on Selection(en) du menu View. Désormais vous pouvez suivre la ligne jusqu'à la fuite.

Autres causes de fuites

En dehors des brèches qui donnent vers l'extérieur de la géométrie, il y a d'autres erreurs de carte qui peuvent faire que VBSP(en) génère une erreur de fuite.

Entités en dehors du niveau

Positionner une entité dans le vide (void(en)) provoquera une fuite.

Toutes les entités doivent se situer à l'intérieur d'un espace jouable ou une Skybox(en). VBSP(en) traite toutes les entités brush comme si elles n'étaient pas présentes, ainsi en fermant la carte une entité brush, comme la func_door(en), provoquera la même situation qu'une brèche.

Areaportals mal positionnés

Areaportals qui ne ferment pas bien les zones provoqueront des fuites.

Les messages d'erreur de fuite peuvent aussi être générées par un areaportal(en) qui ne sépare pas correctement 2 zones. Utilisez la même méthode que pour les brèches de géométrie pour identifier les fuites.

Les géométries spéciales ne ferment pas le monde

Fermez les zones derrière des géométries non solides pour éviter les fuites.

Displacements(en) et water(en) ne ferment pas les cartes provoqueront des fuites. Vous pouvez résoudre ce type de fuite en ajoutant un brush juste derrière elles pour fermer la carte. En utilisant le brush avec le matériau tools/toolsnodraw fermera la carte, mais généra pas de calcul de rendu supplémentaire, ce qui est une bonne solution pour les displacements. water(en) devrait être fermée avec ce qui ferme la zone au dessus (problablement tools/toolsskybox ou une autre texture classique comme des briques). N'utilisez pas nodraw(en) pour fermer l'eau, ce qui provoquera un effet de trainée bizarre.

Origines d'entités décalées

Une origine séparée de son entité parent et se trouvant en dehors du niveau, provoquera une fuite.

Une autre cause subtile de fuite peut provenir d'entités qui ont des origines, comme les func_door_rotating(en) ou les func_rot_button(en). Lorsque l'entité elle-même est dans le monde, si son origine est en dehors de la carte, l'entité provoquera une fuite. Si vous trouvez un pointfile(en) pointant vers une zone en dehors de la carte, et qu'il n'y a aucune entité, il faudra rechercher plutôt une origine d'entité.

Pour savoir si la cause est l'origine d'une entité :

  1. Charger le pointfile.
  2. Trouver l'extrémité du pointfile.
  3. Choisissez Select All du menu Edit.
  4. Assurez vous que la case Show Helpers(en) est cochée dans le menu View.
  5. Si vous voyez une origine apparaitre, vous saurez qu'il s'agit de ce problème.

Si vous avez un problème d'origine, vous pouvez sélectionner l'objet et déplacer manuellement l'origine pour le placer dans le monde, utiliser la commande Center Origins(en) du menu Tools, ou simplement cliquer droit sur l'origine et choisir Center on entity.

Les décalages d'origine des entités arrivent généralement lorsqu'une entité brush avec une de ses origines est déplacée en étant dans le mode Solids(en). Déplacer une entité brush en mode solide ne déplace pas son origine.

Géométrie translucide

Les Brushes avec matériaux translucides, comme le verre, peuvent provoquer des fuites dans un cas. Cela arrive lorsque le brush avec texture translucide fait face au vide. Cela importe peu de quel côté se situe la texture translucide, à partir du moment où un côté est translucide fera que le brush ne fermera pas le niveau.

Dans ce cas votre pointfile ira directement à travers votre brush jusqu'à l'entité la plus proche. Contrôlez s'il est possible de voir dans le vide et inversement à travers les 6 faces du brush pour lequel le pointfile passe à travers. Par ailleurs, cela peut être facilement corrigé en faisant un Apply current texture avec la texture tools/nodraw, et en appliquant une texture sur les faces visibles.

Func_viscluster

func_viscluster(en) peut aussi provoquer des fuites lorsqu'ils croisent des matériaux d'eau(en) ou des areaportal(en), ou sont trop prêts d'eux, donc évitez de croiser func_viscluster(en) avec des areaportals.

Si cela nécessite réellement d'être utilisé sur l'eau, mettez le brush pour la surface de l'eau d'un côté, et ensuite créez un second, séparé func_viscluster(en) de l'autre coté. Ne croisez jamais un func_viscluster(en) avec plan d'eau, ou des choses étranges se produiront.

En dernier recours, si cela génère toujours une fuite, essayez de supprimer ou déplacer le viscluster loin des areaportals. Compilez ensuite et voyez si cela corrige le problème.

Fausses fuites

Bien que très rare, il est possible que VBSP remonte de fausses fuites sur votre niveau. Si vous êtes sur qu'il ne devrait pas y en avoir, copiez votre carte et collez la dans un nouveau fichier. Si cela compile bien, votre ancien fichier était certainement corrompu.

Aucune entité dans le niveau

Ne pas voir d'entité dans le niveau provoquera une fuite. Ceci s'explique par le fait que les pointfiles partent d'une entité, car VBSP utilise les entités comme point de référence sur ce qui se trouve à l'intérieur d'une carte. Votre carte devrait toujours avoir au moins un spawn entity(en) à l'intérieur.

func_detail non couverts

Ne pas recouvrir func_detail(en) avec des solid brushes, peut aussi provoquer des fuites qui peuvent être difficiles à identifier si une personne ne réalise pas que cela est causé par un func_detail(en).

Situations qui ne provoquent pas de fuites

Il y a beaucoup de situations qui ne génèrent pas de fuite, même si une entité est positionnée en dehors de la carte.

Instances

Les instances ne sont pas des entités - lors du chargement, leur contenu est fusionné dans la carte. Cela signigie que les brushes à l'intérieur des instances peuvent fermer la carte, et la position du func_instance(en) importe peu, à partir du moment où les entités des instances sont placées à l'intérieur de la carte.

Seule l'origine compte

Seule l'origine des entités est prise en compte lors de la recherche de fuites. La géométrie d'un brush ou modèle peut être partiellement ou entièrement dans le vide, à partir du moment où l'origine est à l'intérieur de la carte. Évidemment aucune lumière n'est capable d'atteindre le vide, donc ces entités ne seraient pas éclairés ou invisibles.

Entités à l'origine et à l'intérieur de brushes

Les entités avec leur origine aux coordonnées exactes 0 0 0, ou dont l'origine est à l'intérieur d'un brush solide ne provoque pas de fuite. Ils sont effectivement ignorés lors de l'évaluation des zones intérieur/extérieur.

Conclusion: An ounce of prevention

Using the pointfile tools makes finding leaks relatively painless, but one of the most important ways to fix leaks is by preventing them in the first place. Taking your time when building, and making sure brushes are snapped properly to the grid can go a long way towards eliminating leaks before they occur. The cleaner and more organized your geometry, the more likely you are to be able to spot leaks when they occur, or even prevent them from happening in the first place. You can also help prevent lots of extra work by compiling your level as you go along, instead of building your whole level before trying to compile it. Finding one leak at a time while the map is only partially complete is a lot easier and faster than finding leaks in a complete map that is full of geometry.

What about Source 2?

In Source 2 Source 2, since BSP geometry has been replaced with Mesh(en) geometry, Source 2 maps are no longer required to be sealed off to prevent leaks. However it will still be beneficial to do so to help the VIS(en) calculation processes during compile.