Ru/Leak
Template:Otherlang2 Template:Finishtranslation:ru
Что такое утечка (leak)?
Уровни, созданные для Source Engine должны быть полностью изолированными. Это означает, что пространство вашего уровня не должно соприкасаться с внешним миром, с "пустотой", говоря проще ваш уровень не должен содержать "дырок". Таким образом небо должно реализовываться с помощью браша с нанесенной на него tools/toolsskybox
текстурой. Когда пространство уровня "соприкасается" с пустотой, при компиляции карты vbsp
генерируется leak . Когда происходит утечка, компилятор не знает какая часть уровня находится внутри, а какая снаружи и 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
не запустится пока на карте есть утечка. Это в свою очередь, при запуске уровня, приведет к тому, что Source движок не будет знать как следует визуализировать уровень и какие ограничения накладывать на этот процесс, поэтому движок попытается отрисовать весь уровень. Это безусловно приведет к необходимости рендерить большое количество полигонов и неправильной или не полной отрисовки некоторых частей карты.
Быстрый способ проверки на утечку (leaked)
При компиляции карты зачастую будут возникать ошибки об утечки (leaked) (а если учесть то сколько времени Вы можете потратить на полную компиляцию карты, лишь для того чтобы узнать что ваша карта не работает (есть ошибка leaked)), поэтому перед полной компиляцией карты, всегда делайте быструю. Это позволит Вам быстро отловить ошибки на карте и в конечном итоге сэкономит время. Для этого: нажмите F9 (File->Run Map), в открывшемся диалоге установите для VIS и RAD свойство NO, а также отметьте пункт Don't run game after compiling (не запускать игру после компиляции) и Wait for keypress when done compiling (закрывать окно компиляции после нажатия клавиши):
Поиск утечки(leaks) на карте
Иногда утечка(leaked) не столь очевидна, как в примере выше. Она могут составлять всего лишь одну единицу ширины и соответственно по-прежнему будет вызывать ошибку. Для этого необходимо использовать инструменты компиляции, в нашем случае это pointfile. Pointfile это файл, созданный vbsp
, типа имя карты.lin
. После возникновения ошибки об утечки, vbsp
сгенерирует файл имя карты.lin
, который будет создан в той же директории, где находится ваш .vmf файл.
Загрузка Pointfile (файл имя карты.lin
)
Это изображение показывает загруженный pointfile на вашей карте. Обратите внимание, что красная линия появляется в обоих 3D-и 2D-видах.
Таким образом, вы можете найти источник утечки(leaked), следуя за красной линией. Начинайте поиск с объекта, указанного в сообщение об ошибке vbsp
во время компиляции. Следуйте за красной линией пока не найдете разрыв в геометрии. Устраните разрыв и перекомпилируйте уровень, чтобы перейти к следующему объекту вызвавшего ошибку leaked.
Поиск источника утечки
Если у вас возникли проблемы с поиском объекта(источника), который вызвал ошибку, Вы можете использовать координаты объекта которые Вам указал компилятор, далее чтобы ввести эти координаты выберите в меню View->Go to Coordinates и введите координаты. При этом в 2D-и 3D видах будет показан заданный объект.
Другой метод нахождения источника утечки заключается в уменьшении масштаба в одном из 2D видах. После загрузки pointfile, уменьшите масштаб, пока не увидите красную линию. Следуйте за линией, пока не определите причину утечки. Затем выделите объект и в меню выберите View->Center 3D Views on Selection. Теперь Вы можете увидеть утечку в 3D виде.
Другие причины вызывающие утечку (leaks)
Помимо ошибок связанных с геометрией уровня, могут возникать и другие причины утечки, которые генерирует vbsp.
Энти(Entities) размещённые за приделами уровня

Одна из распространённых ошибок является случайным размещением энти за пределами уровня. Допустим, в начале разработки уровня вы поместите для удобства несколько энти за приделами уровня, а после забудете удалить.
Также распространённая ошибка, когда Вы с помощью энти (например func_door.
) "заделываете" границу уровня, например это может быть дверь у кабинета и т.п. Любые энти реально не блокируют видимости при компиляции vbsp, т.е. если за энти "дырка" на уровне, то для vbsp это будет являться утечкой и вызовет ошибку Leak.
Также не стоит забывать, что все энти объекты должны быть внутри допустимой области памяти уровня (от перв.: т.е. если размещённые энти заходят одной частью за границу уровня, то это будет являться утечкой для vbsp), так как vbsp сравнивает границы уровня с координатами и размерами энти.
Неправильно построенная область портала (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.