Утечка
Что такое утечка (leak)?
Уровни, созданные для Source Engine должны быть полностью изолированными. Это означает, что пространство ващего уровня не должно соприкасаться с внешним миром, с "Void", говоря проще ваш уровень не должен содержать "дырок". Таким образом небо должно реализовываться с помощью браша с нанесенной на него tools/toolsskybox
текстурой. Когда пространство уровня "соприкасается" с пустотой, генерируется leak когда карта компилируется vbsp
. Когда происходит утечка, компилятор не знает какая часть уровня находится внутри, а какая снаружи и vvis
не может быть запущен. Если vvis не запускать, то множество эффектов может не работать или работать неправильно, включая воду и некоторые поверхности будут выглядеть как клубы пыли.
Этот пример показывает карту с неправильно геометрией соединяющий пространство уровня и пустоту. При компиляции будет выдана ошибка утечки:
Когда карта компилируется с такой дырой, vbsp выводит сообщение об ошибке в лог компиляции:
ProcessBlock_Thread: 0...1...2...3...4...5...6...7...8...9...10 (0) **** leaked **** Entity light (-1607.69 -1094.12 -183.00) leaked!
Этим сообщением об ошибке, vbsp сообщает Вам о присутствует утечки на карте, а так же название первой попавшейся ему энтити связанной с пустотой ( в нащем случае, это свет ). Vbsp так же выводит мировые координаты X, Y и Z утечки вызванной этой энтити.


Эффекты утечек
Утечка на уровне имеет ряд негативных эффектов. Вопервых, vbsp
будет сообщать о наличии утечки, и не создаст portal файл (mapname.prt
). portal файл используется vvis
для вычислений визуализации. Без portal файла vvis
вообще не запустится. Соответственно vvis
не создаст файлы необходимые для работы vrad
, рассчитывающим сложное освещение. По этой причине vrad
расчитает только прямое освещение - никакой трассировки и сложных эффектов со светом.
Наиболее серьезным эффектом на сегодняшний день является то, что vvis
не запустится пока на карте есть утечка. Когда уровень будет запущен в игре, движок отрисовки не будет иметь никакой информации как следует визуализировать уровень и какие ограничения накладывать на этот процесс, поэтому движок попытается отрисовать весь уровень. Это безусловно приведет к необходимости рендерить большое количество полигонов и неправильной или не полной отрисовки некоторых частей карты.
Checking for leaks the fast way
The BSP part of your compile will always report any leaks it finds, but spending hours of full compile time and game execution just to find out that your map is broken after compilation, simply isn't efficient. If you have the slightest suspicion that your map might have a leak - normally when you've expanded the brushwork borders of the map - you can run a fast compile to check for BSP errors by opening the Run Map dialog, turning off VIS and RAD compile tools, and checking the Don't run game after compiling flag. The process of checking your entire map for leaks will only take about 8 seconds with this method.
Finding leaks
Sometimes these gaps aren't quite as obvious as the above example. They can be as little as one unit wide and still cause a leak. The compile tools provide you with a pointfile to help you locate the leak. A pointfile is a file generated by vbsp
that draws a line between the void of the map to the entity it found during the leak check. After receiving a leak error in vbsp
, a mapname.lin
file will be created in the same directory as your .vmf map file.
Loading a Pointfile
The pointfile can be loaded into the Hammer Editor to show you precisely where the leak is inside the level. To load a pointfile for the level, use the Load Pointfile command in the Map menu.
This image shows the pointfile loaded into the previous example. Notice that the red line appears in both the 3D and 2D views, and is traced back from the entity through the gap.
Using this visual aid, you can find the source of the leak by following the red line to the outside of the level. It's best to start at the entity specified in the vbsp
error message, and then follow the line until you find the gap in the geometry. Close the gap and recompile the level to see if you have fixed the leak.
Finding the endpoint
If you're having trouble locating the start entity, you can use the Go to Coordinates command on the View menu to find the entity and the start of the pointfile line. Simply enter the coordinates given by vbsp
for the entity location, and the 2D and 3D views will be centered on that location. Follow the line to find your leak.
Another method to find the source of the leak is to zoom out in one or more of the 2D views. After loading the pointfile, zoom out until you see the red line. Follow the line until you reach the entity at the one of the endpoints. Then select the entity, and choose Center 3D Views on Selection from the View menu. Now you can follow the pointfile line to find the leak.
Other causes of leaks
Besides gaps in outside geometry, there are other map errors that can cause vbsp to generate a leak error.
Entities outside the level

One common mistake is the accidental placement of an entity outside the interior level space. This can happen if you place an entity outside in the void area while you're working on it, then forget to delete it when you're finished. This can also occur if you attempt to seal the map with an brush entity, such as a func_door.
Since brush entities do not block visibility, this will create the same condition as if there were a gap in their place. All entities must be inside valid level space, or the map will generate a leak. This is because vbsp determines the inside of the level depending on where it finds entities.
Improperly constructed areaportals
Leak error messages can also be generated when an areaportal does not properly seal the two areas it connects. Find leaks with areaportals using the same methods as geometry gap leaks.
See areaportal for more information on the uses of areaportals.
Non-solid geometry does not seal the world
One more cause of leaks is if you try to seal a map using other types of non-solid geometry, such as displacements (terrain), water, or func_detail
brushes. None of these non-solid brush types will block visibility and seal the world. Attempting to use them in this way will generate a leak. You can fix this type of leak by adding a solid brush behind them to seal the map. Using a brush with the tools/toolsnodraw
material will seal the map, but not add any additional rendering cost, so it's a great way to seal the map behind non-solid geometry.
Mismatched entity origins
A more subtle cause of leaks can be with any entities that have origin helpers, such as func_door_rotating or func_rot_button. While the entity itself may be inside the world, if the origin helper is outside the map, the entity will cause a leak. If you find a pointfile heading to a empty spot outside of the map, and there is no entity there, an origin helper is a good thing to look for.
One way to quickly tell if an entity origin is causing the leak is to:
- Load the pointfile.
- Find the endpoint(s) of the pointfile.
- Choose Select All from the Edit Menu.
- Make sure Show Helpers is checked on the View Menu.
- If you see an origin helper appear at the pointfile, you know that's the problem.
If you have an origin helper causing a leak, you can select the object and manually move the origin back into the world, use the Center Origins command from the Tools Menu, or simply right-click on the origin helper and select Center on entity.
Mismatched entity origins usually occur when a brush entity with one of these helpers is moved while in Solids mode. Moving a brush entity in solids mode does not move the entity's origin helper.
Translucent geometry
There is a particular case where your geometry could be entirely sealed and yet a leak would constantly appear, even if you have absolutely no entity around the leak. If loading the pointfile doesn't help you at all, then you might be facing this particular situation. In this case, the red line would be passing through solid geometry. The cause is pretty simple - it is most likely that you have at least one of the brush sides textured with a translucent material. When this situation appear, the brush isn't able to seal anything anymore. In most cases, this will cause problems with areaportals that wouldn't be able to seal rooms. Remember that the sides in question could be located anywhere, even between other brushes.
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 a leaks in a complete map that is full of geometry.