Ru/Leak: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
mNo edit summary
 
(34 intermediate revisions by 12 users not shown)
Line 1: Line 1:
{{otherlang2
{{LanguageBar|title = Утечка}}
|title=Утечка
|de=Leak:de
|en=Leak
}}
{{finishtranslation:ru}}


== Что такое утечка (leak)? ==
Уровни, созданные для Source Engine должны быть полностью изолированными. Это означает, что пространство вашего уровня не должно соприкасаться с внешним миром, с "[[Void|пустотой]]", говоря проще ваш уровень не должен содержать "дырок". Таким образом небо должно реализовываться с помощью браша с нанесенной на него <code>tools/toolsskybox</code> текстурой. Когда пространство уровня "соприкасается" с пустотой, генерируется '''leak''' когда карта компилируется <code>[[Vbsp|vbsp]]</code>. Когда происходит утечка, компилятор не знает какая часть уровня находится внутри, а какая снаружи и <code>[[Vvis|vvis]]</code> не может быть запущен. Если vvis не запускать, то множество эффектов может не работать или работать неправильно, включая воду и некоторые поверхности будут выглядеть как клубы пыли.


Этот пример показывает карту с неправильно геометрией соединяющий пространство уровня и пустоту. При компиляции будет выдана ошибка утечки:


[[Image:hammer_leaks1.jpg|frame|left|px=200|Дыра в геометрии уровня приводящая к утечки.]]{{clr}}
Карты {{L|BSP}} изнутри должны быть полностью герметичны. Ни одна деталь интерьера карты не должна соприкасаться с внешней "{{L|Void|пустотой}}". Даже небо должно быть запечатано коробом из элементов с текстурой <code>tools/toolsskybox</code>. Если на карте появляется какая-либо щель в пустоту, то во время компиляции {{L|VBSP}} немедленно генерируется '''leak''' . Когда происходит утечка, {{L|VBSP}} не знает, какая часть карты находится внутри, а какая снаружи, и не отработает должным образом. В этом случае не будут работать некоторые эффекты, например, воды.


Когда карта компилируется с такой дырой, [[Vbsp|vbsp]] выводит сообщение об ошибке в лог компиляции:
Пример ниже показывает карту с явным зазором в геометрии, ведущим к пустоте. При компиляции будет выдана ошибка утечки:
 
[[File:hammer_leaks1.jpg|frame|left|px=200|Зазор в геометрии, ведущий к пустоте, вызывает утечку.]]{{clr}}
 
Когда карта компилируется с таким зазором, {{L|VBSP}} выводит в журнал компиляции сообщение об ошибке :


<pre>
<pre>
Line 21: Line 17:
</pre>
</pre>


Этим сообщением об ошибке, vbsp сообщает Вам о присутствует утечки на карте, а так же название первой попавшейся ему энтити связанной с пустотой ( в нашем случае, это свет ). Vbsp так же выводит мировые координаты X, Y и Z утечки вызванной этой энтити.
Здесь VBSP сообщает Вам об утечке и указывает название первой попавшегося ему объекта мира, связанного с пустотой (в нашем случае, это свет). Он также даёт местоположение этого объекта, выраженное в координатах мира X, Y и Z.
{{note|Часто энтити выводимая компилятором в лог не является причиной утечки. Удаление привет к появлению ошибки, в которой будет указана другая энтити, удаление не решает проблемы! Однако существует ситуация когда удаление энтити устраняет утечку: это когда энтити находится за границам уровня. Этот случай будет описан ниже в этой статье.}}
{{Note|Зачастую, упомянутый объект не является причиной утечки, это всего лишь след. Его удаление не решит проблему, просто будет указан другой объект! Но существует ситуация, когда удаление объекта устраняет утечку: это когда он находится за границам игровой карты. Этот случай будет описан ниже.}}
 
{{Note|Если ваша карта не содержит ни одного точечного объекта, {{L|VSBP|VBSP}} может сообщить об утечке, поскольку нет способа определить, какая часть является интерьером карты, а какая пустотой.}}
 
{{Note|Карты {{L|Portal 2}} не будут компилироваться при возникновении утечки, кроме случаев просмотра карт в {{L|Portal 2 Puzzle Maker|puzzlemaker}}.}}


{{note|Если ваша карта не содержит ни одной энтити, [[Vbsp|vbsp]] может сообщит об утечке, поскольку нет способа определить какая часть является интерьером уровня, а какая экстерьером.}}
{{Note|В Portal 2, {{csgo}}{{L|Counter-Strike: Global Offensive}} и {{Game link|Alien Swarm}}, если возникает утечка и не запускается {{L|VVIS}}, карта не сможет скомпилировать скайбокс.}}


== Эффекты утечек ==
== Эффекты утечек ==


Утечка на уровне имеет ряд негативных эффектов. Во первых, <code>vbsp</code> будет сообщать о наличии утечки, и не создаст ''portal'' файл (<code>''mapname''.prt</code>). ''portal'' файл используется <code>[[Vvis|vvis]]</code> для вычислений визуализации. Без ''portal'' файла <code>vvis</code> вообще не запустится. Соответственно <code>vvis</code>  не создаст файлы необходимые для работы <code>[[Vrad|vrad]]</code>, рассчитывающим сложное освещение. По этой причине <code>vrad</code> рассчитает только прямое освещение - никакой трассировки и сложных эффектов со светом.
Утечка на карте имеет ряд негативных эффектов. Во первых, <code>vbsp</code> будет сообщать о наличии утечки, и не создаст ''portal'' файл (<code>''mapname''.prt</code>). ''portal'' файл используется <code>{{L|VVIS|vvis}}</code> для вычислений визуализации. Без ''portal'' файла <code>vvis</code> вообще не запустится. Соответственно <code>vvis</code>  не создаст файлы необходимые для работы <code>{{L|VRAD}}</code>, рассчитывающим сложное освещение. По этой причине <code>vrad</code> рассчитает только прямое освещение - никакой трассировки и сложных эффектов со светом.


Наиболее частой проблемой на сегодняшний день является то, что <code>vvis</code> не запустится пока на карте есть утечка. Это в свою очередь, при запуске уровня, приведет к тому, что Source движок не будет знать как следует визуализировать уровень и какие ограничения накладывать на этот процесс, поэтому движок попытается отрисовать весь уровень. Это безусловно приведет к необходимости рендерить большое количество полигонов и неправильной или не полной отрисовки некоторых частей карты.
Наиболее частой проблемой на сегодняшний день является то, что <code>vvis</code> не запустится пока на карте есть утечка. Это в свою очередь, при запуске карты, приведет к тому, что платформа {{Source|4.1}} не будет знать как следует визуализировать карту и какие ограничения накладывать на этот процесс, поэтому платформа попытается отрисовать всю карту. Это безусловно приведет к необходимости рендерить большое количество полигонов и неправильной или не полной отрисовки некоторых частей карты.


== Быстрый способ проверки на утечку (leaked) ==  
== Быстрый способ проверки на утечку (leaked) ==  


При компиляции карты зачастую будут возникать ошибки об утечки (leaked) (а если учесть то сколько времени Вы можете потратить на полную компиляцию карты, лишь для того чтобы узнать что ваша карта не работает (есть ошибка leaked)), поэтому перед полной компиляцией карты, всегда делайте быструю. Это позволит Вам быстро отловить ошибки на карте и в конечном итоге сэкономит время. Для этого: нажмите F9 (File->''Run Map''), в открывшемся диалоге установите для VIS и RAD свойство ''NO'', а также отметьте пункт ''Don't run game after compiling'' (не запускать игру после компиляции) и Wait for keypress  when done compiling (закрывать окно компиляции после нажатия клавиши):
При компиляции карты зачастую будут возникать ошибки об утечки (leaked) (а если учесть то сколько времени Вы можете потратить на полную компиляцию карты, лишь для того чтобы узнать что ваша карта не работает (есть ошибка leaked)), поэтому перед полной компиляцией карты, всегда делайте быструю. Это позволит Вам быстро отловить ошибки на карте и в конечном итоге сэкономит время. Для этого: нажмите F9 (File->''Run Map''), в открывшемся диалоге установите для VIS и RAD свойство ''NO'', а также отметьте пункт ''Don't run game after compiling'' (не запускать игру после компиляции) и Wait for keypress  when done compiling (закрывать окно компиляции после нажатия клавиши):
[[Image:Run_map.jpg|frame|left|px=200|свойства компилятора(Run map).]]{{clr}}
[[File:Run_map.jpg|frame|left|px=200|свойства компилятора(Run map).]]{{clr}}


== Поиск утечки(leaks) на карте ==
== Поиск утечки(leaks) на карте ==


Иногда утечка(leaked) не столь очевидна, как в примере выше. Она могут составлять всего лишь одну единицу ширины и соответственно по-прежнему будет вызывать ошибку. Для этого необходимо использовать инструменты компиляции, в нашем случае это pointfile. Pointfile это файл, созданный <code>vbsp</code>, типа <code>''имя карты''.lin</code>. После возникновения ошибки об утечки, <code>vbsp</code> сгенерирует файл <code>''имя карты''.lin</code>, который будет создан в той же директории, где находится ваш .vmf файл.
Иногда утечка(leaked) не столь очевидна, как в примере выше. Она может составлять всего лишь одну единицу ширины и соответственно по-прежнему будет вызывать ошибку. Для этого необходимо использовать инструменты компиляции, в нашем случае это pointfile. Pointfile это файл, созданный <code>vbsp</code>, типа <code>''имя карты''.lin</code>. После возникновения ошибки об утечки, <code>vbsp</code> сгенерирует файл <code>''имя карты''.lin</code>, который будет создан в той же директории, где находится ваш .vmf файл.


=== Загрузка Pointfile (файл <code>''имя карты''.lin</code>) ===
=== Загрузка Pointfile (файл <code>''имя карты''.lin</code>) ===


[[Image:hammer_leaks5.jpg||thumb|400px|right| Загрузка файла Pointfile.]]
[[File:hammer_leaks5.jpg||thumb|400px|right| Загрузка файла Pointfile.]]
Это изображение показывает загруженный pointfile на вашей карте. Обратите внимание, что красная линия появляется в обоих 3D-и 2D-видах.  
Это изображение показывает загруженный pointfile на вашей карте. Обратите внимание, что красная линия появляется в обоих 3D-и 2D-видах.  


Таким образом, вы можете найти источник утечки(leaked), следуя за красной линией. Начинайте поиск с объекта, указанного в сообщение об ошибке <code>vbsp</code> во время компиляции. Следуйте за красной линией пока не найдете разрыв в геометрии. Устраните разрыв и перекомпилируйте уровень, чтобы перейти к следующему объекту вызвавшего ошибку leaked.{{clr}}
Таким образом, вы можете найти источник утечки(leaked), следуя за красной линией. Начинайте поиск с объекта, указанного в сообщение об ошибке <code>vbsp</code> во время компиляции. Следуйте за красной линией пока не найдете разрыв в геометрии. Устраните разрыв и перекомпилируйте карту, чтобы перейти к следующему объекту вызвавшего ошибку leaked.{{clr}}
 
=== Поиск источника утечки ===
 
Если у вас возникли проблемы с поиском объекта(источника), который вызвал ошибку, Вы можете использовать координаты объекта которые Вам указал компилятор, далее чтобы ввести эти координаты выберите в меню {{L|Hammer_View_Menu#Go_to_Coordinates...|View->Go to Coordinates}} и введите координаты. При этом в 2D-и 3D видах будет показан заданный объект.
 
[[File:Hammer_Go_To_Coord.png]]
 
Другой метод нахождения источника утечки заключается в уменьшении масштаба в одном из 2D видах. После загрузки pointfile, уменьшите масштаб, пока не увидите красную линию. Следуйте за линией, пока не определите причину утечки. Затем выделите объект и в меню выберите {{L|Hammer_View_Menu#Center_Views_on_Selection_.3CCtrl.2BE.3E|View->Center 3D Views on Selection}}. Теперь Вы можете увидеть утечку в 3D виде.
 
== Другие причины вызывающие утечку (leaks) ==
 
Помимо ошибок связанных с геометрией карты, могут возникать и другие причины утечки, которые генерирует {{L|VBSP}}.
 
=== Объекты (Entities) размещённые за пределами карты ===
[[File:hammer_leaks2.jpg||thumb|300px|right|Размещение любого объекта в пустоте {{L|Void}} приведёт к утечке (leak).]]
Одна из распространённых ошибок является случайным размещением объекта за пределами карты. Допустим, в начале разработки карты Вы поместите для удобства несколько объектов за приделами карты, а после забудете удалить.
Также распространённая ошибка, когда Вы с помощью объекта (например <code>func_door</code>) "заделываете" границу карты, например это может быть дверь у кабинета и т.п. Любые объекты реально не блокируют видимости при компиляции vbsp, т.е. если за объектом зазор на карте, то для vbsp это будет являться утечкой и вызовет ошибку Leak.
Также не стоит забывать, что все объекты должны быть внутри допустимой области памяти карты (от перв.: т.е. если размещённые объекты заходят одной частью за границу карты, то это будет являться утечкой для vbsp), так как vbsp сравнивает границы карты с координатами и размерами объектов.{{clr}}
 
=== Неправильно построенный ареапортал(areaportal) ===
[[File:hammer_leaks3.jpg||thumb|300px|right|Areaportal'ы которые не прилегают в плотную к соответствующим элементам карты - вызовут утечку.]]
Особенно часто неправильно размещают {{L|areaportal|ареапортал(areaportal)}} при создание дверных проёмов с дверьми. Потому как, если в проёме встречаются не только {{L|brush|элементы карты}}, а еще и объекты, то ареапортал надо продлить до настоящих элементов карты. Т.е. {{L|areaportal|ареапортал(areaportal)}} должен полностью собой перегородить все элементы карты соприкасающиеся с ним.
Метод нахождения проблемного {{L|areaportal|ареапортала(areaportal)}} такой же как и при нахождение утечки на карте, который описан выше.
Более подробно этот вопрос рассмотрен в разделе про {{L|areaportal|ареапорталы(areaportal)}} {{clr}}
 
=== Использование "Нетвёрдой" геометрии ===
[[File:hammer_leaks4.jpg||thumb|300px|right|Заделывания зазора на карте с помощью "нетвёрдой" геометрии вызовет утечку.]]
 
Ещё одной причиной утечек является попытка заделывания зазоров карты с использованием так называемой нетвёрдой геометрии, например, ландшафт, вода, или использование объекта {{L|func_detail}}. Ни один из этих "нетвёрдых" типов объектов не будет блокировать видимость на карте. Попытка использовать их таким образом создаст утечки. Вы можете исправить этот тип утечки, добавив обычный элемент за ними, для заделывания зазора на карте.
Используйте элемент для заделывания зазоров на карте с материалом <code>tools/toolsnodraw</code>.{{clr}}
 
=== Неправильное размещение центров объектов (origin helpers) ===
[[File:hammer_origin_leak.jpg|thumb|300px|right|Метка центра (origin helper), отделённая от родительского объекта за пределы карты, вызывает '''утечку''')]]
 
Менее очевидные причины '''утечки''' могут быть с любым объектом, которые созданы как {{L|func_door_rotating}} или {{L|func_rot_button}} и используют метки центра (origin helpers) (так например, при создании кнопки (func_rot_button) нужно создавать ось вращения, которая является меткой центра). С одной стороны объект (например сама кнопка) сам по себе может размещаться внутри карты, но метка центра (origin helper) снаружи, либо где-то пересекает границу карты, то это приведёт к '''утечке'''.
Так если у Вас возникла ошибка '''утечка'''(leak) и vbsp смог генерировать pointfile (имя_карты.lin), то на месте указанном в файле реально объекта может и не быть. В этом случае необходимо искать '''метку центра'''(origin helper).
 
Один из способов узнать является ли '''метка центра''' (origin) источником ошибки:
# Загрузите pointfile (имя_карты.lin).
# Найдите конечные точки в pointfile (т.е. следуйте за красной линией до конца, методика поиска расписаны выше).
# Выберите '''Select All''' из меню '''Edit Menu'''.
# Убедитесь что в меню вида '''View Menu''' выбран пункт '''{{L|Hammer_View_Menu#Show Helpers|Показать метки(Show Helpers)}}'''.
# Если Вы увидели после этого объект типа '''метка центра'''(origin helper) при загруженном pointfile, то значит проблема именно в этом.
 
Если у Вас утечку вызывает именно '''метка центра'''(origin helper), то вы можете выбрать этот объект и вручную переместить его внутрь карты, используйте для этого команду {{L|Hammer_Tools_Menu#Center_Origins|Center Origins}} из меню '''Tools Menu''', или щёлкните правой кнопкой мыши по '''метке центра'''(origin helper) и выберите '''Center on entity'''.
 
Неправильное размещение '''меток центра''' обычно происходят, когда объект (например {{L|func_rot_button}}) с одним из меткой центра (origin helper) перемещается в режиме {{L|Hammer_Selection_Modes_Toolbar|Тела(Solids)}}. Перемещение {{L|brush entity|объёмного элемента мира}} в режиме {{L|Hammer_Selection_Modes_Toolbar|Тела(Solids)}} не перемещает '''метки центра'''(origin helpers).{{clr}}
 
=== Прозрачная геометрия ===
 
Существует частный случай, когда ваша геометрия может полностью закрывать все зазоры карты и тем не менее утечка будет постоянно появляться, даже если у Вас нет абсолютно ни одного объекта вокруг места утечки. Если загрузка pointfile Вам не помогла, то скорее всего это именно тот случай.
Загрузив pointfile Вы увидите что, красная линия будет проходить через некоторые элементы. Причина довольно проста - скорее всего у Вас одна из сторон элемента текстурирована полупрозрачным материалом. В такой ситуации этот элемент не будет закрывать эту часть карты, и следовательно это будет являться зазором. В большинстве случаев, это также вызовет проблемы с граничащими с этими элементами ареапорталами (areaportals), которые также вследствие этого не смогут изолировать карту от пустоты.
Помните, что стороны элемента с текстурами могут быть расположены где угодно, даже между другими элементами.
 
=== Func_viscluster ===
 
{{L|Func_viscluster}} can also cause leaks when they cross areaportal surfaces, or are too close to them. Disabling all func_visclusters and compiling to see if the leak is gone should be done, at least as last resort. {{Todo|How do you ''actually'' fix this?}}
 
=== Мнимые утечки ===


=== Finding the endpoint ===
Although very rare, it is possible VBSP reports false leaks in your level. If you are sure that there should not be a leak reported by VBSP, copy your map and paste it into a fresh new map file. If it compiles fine, then your old file could have been corrupted.


Если у вас возникли проблемы с поиском объекта(источника), который вызвал ошибку, Вы можете использовать координаты объекта которые Вам указал компилятор, далее чтобы ввести эти координаты выберите в меню [[Hammer_View_Menu#Go_to_Coordinates...|View->Go to Coordinates]] и введите координаты. При этом в 2D-и 3D видах будет показан заданный объект.
=== Отутствие каких либо объектов на карте ===


[[Image:Hammer_Go_To_Coord.png]]
Not having any type of entity inside the level will cause a leak. This is why pointfiles originate at an entity, because VBSP uses entities as a reference point for what ''is'' the inside of a map. Your map should always at least have a {{LCategory|Player spawn entities|spawn entity}} in it.


Другой метод нахождения источника утечки заключается в уменьшении масштаба в одном из 2D видах. После загрузки pointfile, уменьшите масштаб, пока не увидите красную линию. Следуйте за линией, пока не определите причину утечки. Затем выделите объект и в меню выберите[[Hammer_View_Menu#Center_Views_on_Selection_.3CCtrl.2BE.3E|View->Center 3D Views on Selection]]. Теперь Вы можете увидеть утечку в 3D виде.


== Other causes of leaks ==
=== Пустой func_detail ===
Объект {{L|func_detail}} не содержащий элементов мира, также приводит к утечке, которую трудно обнаружить, если не знать, что выполнялись операции с объектом {{L|func_detail}}.


Besides gaps in outside geometry, there are other map errors that can cause [[Vbsp|vbsp]] to generate a leak error.
== Ситуации, когда утечка не происходит ==


=== Entities outside the level ===
Существует ряд ситуаций, которые на самом деле не приводят к утечке, даже если кажется, что объект расположен за пределами карты.
[[Image:hammer_leaks2.jpg||thumb|300px|right|Placing any entity in the [[Void]] will cause a leak.]]
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 <code>func_door.</code> 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.{{clr}}


=== Improperly constructed areaportals ===
=== Вхождения ===
[[Image:hammer_leaks3.jpg||thumb|300px|right|Areaportals that do not seal areas will cause leaks.]]
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.{{clr}}
Instances are not entities - during loading, their contents are merged into the map. This means brushes inside an instance can seal a map, and the location of the actual {{L|func_instance}} entity is not important, as long as any entities in the instance get placed inside the map.


=== Non-solid geometry does not seal the world ===
=== Только центры имеют значение ===
[[Image:hammer_leaks4.jpg||thumb|300px|right|Seal areas behind non-solid geometry to prevent leaks.]]


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 <code>func_detail</code> 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 <code>tools/toolsnodraw</code> 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.{{clr}}
Only the origin of the entity is considered when looking for leaks. The actual geometry of a brush or model can be partially or entirely inside the void, as long as the origin point is inside the map. Of course no lights are able to reach the void, so these entities should probably be unlit or invisible.


=== Mismatched entity origins ===
=== Объекты мира в центре и внутри элементов мира ===
[[Image:hammer_origin_leak.jpg|thumb|300px|right|An origin helper separated from its parent entity and moved outside the level will cause a leak.]]


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.
Entities with their origin at exactly <code>0 0 0</code>, or with their origin inside a solid brush do not leak. They are effectively ignored when determining the inside and outside of the level.


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 '''[[Hammer_View_Menu#Show Helpers|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 [[Hammer_Tools_Menu#Center_Origins|Center Origins]] command from the '''Tools Menu''', or simply right-click on the origin helper and select '''Center on entity'''.
Использование pointfile инструментов делает поиск утечек более простым, а ещё более простое решение и очевидное - это предотвращение утечки. В первую очередь убедитесь, что элементы привязаны к сетке, т.к. создание геометрии карты по сетке исключит возникновение зазоров при стыковке элементов. Также не забывайте, что при создании карты прежде чем её усложнять объектами и дополнительной геометрией - проверьте её на утечку, т.к. потом искать когда на карте будет куча всяких объектов крайне затруднительно.


Mismatched entity origins usually occur when a brush entity with one of these helpers is moved while in [[Hammer_Selection_Modes_Toolbar|Solids]] mode. Moving a brush entity in solids mode does not move the entity's origin helper.{{clr}}


=== Translucent geometry ===
{{ACategory|Level Design}}{{ACategory|Level Design FAQ}}{{ACategory|Glossary}}
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 ==
{{ACategory|Source}}


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.
{{ACategory|Level Design}}
{{ACategory|Level Design FAQ}}


[[Category:Level Design]][[Category:Level Design FAQ]][[Category:Glossary]]
{{ACategory|Hammer}}

Latest revision as of 11:35, 10 April 2025

English (en)Deutsch (de)Español (es)Français (fr)Русский (ru)中文 (zh)Translate (Translate)


Карты BSP(en) изнутри должны быть полностью герметичны. Ни одна деталь интерьера карты не должна соприкасаться с внешней "пустотой(en)". Даже небо должно быть запечатано коробом из элементов с текстурой tools/toolsskybox. Если на карте появляется какая-либо щель в пустоту, то во время компиляции VBSP(en) немедленно генерируется leak . Когда происходит утечка, VBSP(en) не знает, какая часть карты находится внутри, а какая снаружи, и не отработает должным образом. В этом случае не будут работать некоторые эффекты, например, воды.

Пример ниже показывает карту с явным зазором в геометрии, ведущим к пустоте. При компиляции будет выдана ошибка утечки:

Зазор в геометрии, ведущий к пустоте, вызывает утечку.

Когда карта компилируется с таким зазором, VBSP(en) выводит в журнал компиляции сообщение об ошибке :

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 сообщает Вам об утечке и указывает название первой попавшегося ему объекта мира, связанного с пустотой (в нашем случае, это свет). Он также даёт местоположение этого объекта, выраженное в координатах мира X, Y и Z.

Note.pngПримечание:Зачастую, упомянутый объект не является причиной утечки, это всего лишь след. Его удаление не решит проблему, просто будет указан другой объект! Но существует ситуация, когда удаление объекта устраняет утечку: это когда он находится за границам игровой карты. Этот случай будет описан ниже.
Note.pngПримечание:Если ваша карта не содержит ни одного точечного объекта, VBSP(en) может сообщить об утечке, поскольку нет способа определить, какая часть является интерьером карты, а какая пустотой.
Note.pngПримечание:Карты Portal 2(en) не будут компилироваться при возникновении утечки, кроме случаев просмотра карт в puzzlemaker(en).
Note.pngПримечание:В Portal 2, Counter-Strike: Global OffensiveCounter-Strike: Global Offensive(en) и Alien Swarm Alien Swarm , если возникает утечка и не запускается VVIS(en), карта не сможет скомпилировать скайбокс.

Эффекты утечек

Утечка на карте имеет ряд негативных эффектов. Во первых, vbsp будет сообщать о наличии утечки, и не создаст portal файл (mapname.prt). portal файл используется vvis(en) для вычислений визуализации. Без portal файла vvis вообще не запустится. Соответственно vvis не создаст файлы необходимые для работы VRAD(en), рассчитывающим сложное освещение. По этой причине vrad рассчитает только прямое освещение - никакой трассировки и сложных эффектов со светом.

Наиболее частой проблемой на сегодняшний день является то, что vvis не запустится пока на карте есть утечка. Это в свою очередь, при запуске карты, приведет к тому, что платформа Source Source не будет знать как следует визуализировать карту и какие ограничения накладывать на этот процесс, поэтому платформа попытается отрисовать всю карту. Это безусловно приведет к необходимости рендерить большое количество полигонов и неправильной или не полной отрисовки некоторых частей карты.

Быстрый способ проверки на утечку (leaked)

При компиляции карты зачастую будут возникать ошибки об утечки (leaked) (а если учесть то сколько времени Вы можете потратить на полную компиляцию карты, лишь для того чтобы узнать что ваша карта не работает (есть ошибка leaked)), поэтому перед полной компиляцией карты, всегда делайте быструю. Это позволит Вам быстро отловить ошибки на карте и в конечном итоге сэкономит время. Для этого: нажмите F9 (File->Run Map), в открывшемся диалоге установите для VIS и RAD свойство NO, а также отметьте пункт Don't run game after compiling (не запускать игру после компиляции) и Wait for keypress when done compiling (закрывать окно компиляции после нажатия клавиши):

свойства компилятора(Run map).

Поиск утечки(leaks) на карте

Иногда утечка(leaked) не столь очевидна, как в примере выше. Она может составлять всего лишь одну единицу ширины и соответственно по-прежнему будет вызывать ошибку. Для этого необходимо использовать инструменты компиляции, в нашем случае это pointfile. Pointfile это файл, созданный vbsp, типа имя карты.lin. После возникновения ошибки об утечки, vbsp сгенерирует файл имя карты.lin, который будет создан в той же директории, где находится ваш .vmf файл.

Загрузка Pointfile (файл имя карты.lin)

Загрузка файла Pointfile.

Это изображение показывает загруженный pointfile на вашей карте. Обратите внимание, что красная линия появляется в обоих 3D-и 2D-видах.

Таким образом, вы можете найти источник утечки(leaked), следуя за красной линией. Начинайте поиск с объекта, указанного в сообщение об ошибке vbsp во время компиляции. Следуйте за красной линией пока не найдете разрыв в геометрии. Устраните разрыв и перекомпилируйте карту, чтобы перейти к следующему объекту вызвавшего ошибку leaked.

Поиск источника утечки

Если у вас возникли проблемы с поиском объекта(источника), который вызвал ошибку, Вы можете использовать координаты объекта которые Вам указал компилятор, далее чтобы ввести эти координаты выберите в меню View->Go to Coordinates(en) и введите координаты. При этом в 2D-и 3D видах будет показан заданный объект.

Hammer Go To Coord.png

Другой метод нахождения источника утечки заключается в уменьшении масштаба в одном из 2D видах. После загрузки pointfile, уменьшите масштаб, пока не увидите красную линию. Следуйте за линией, пока не определите причину утечки. Затем выделите объект и в меню выберите View->Center 3D Views on Selection(en). Теперь Вы можете увидеть утечку в 3D виде.

Другие причины вызывающие утечку (leaks)

Помимо ошибок связанных с геометрией карты, могут возникать и другие причины утечки, которые генерирует VBSP(en).

Объекты (Entities) размещённые за пределами карты

Размещение любого объекта в пустоте Void(en) приведёт к утечке (leak).

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

Также не стоит забывать, что все объекты должны быть внутри допустимой области памяти карты (от перв.: т.е. если размещённые объекты заходят одной частью за границу карты, то это будет являться утечкой для vbsp), так как vbsp сравнивает границы карты с координатами и размерами объектов.

Неправильно построенный ареапортал(areaportal)

Areaportal'ы которые не прилегают в плотную к соответствующим элементам карты - вызовут утечку.

Особенно часто неправильно размещают ареапортал(areaportal)(en) при создание дверных проёмов с дверьми. Потому как, если в проёме встречаются не только элементы карты(en), а еще и объекты, то ареапортал надо продлить до настоящих элементов карты. Т.е. ареапортал(areaportal)(en) должен полностью собой перегородить все элементы карты соприкасающиеся с ним. Метод нахождения проблемного ареапортала(areaportal)(en) такой же как и при нахождение утечки на карте, который описан выше.

Более подробно этот вопрос рассмотрен в разделе про ареапорталы(areaportal)(en)

Использование "Нетвёрдой" геометрии

Заделывания зазора на карте с помощью "нетвёрдой" геометрии вызовет утечку.

Ещё одной причиной утечек является попытка заделывания зазоров карты с использованием так называемой нетвёрдой геометрии, например, ландшафт, вода, или использование объекта func_detail(en). Ни один из этих "нетвёрдых" типов объектов не будет блокировать видимость на карте. Попытка использовать их таким образом создаст утечки. Вы можете исправить этот тип утечки, добавив обычный элемент за ними, для заделывания зазора на карте.

Используйте элемент для заделывания зазоров на карте с материалом tools/toolsnodraw.

Неправильное размещение центров объектов (origin helpers)

Метка центра (origin helper), отделённая от родительского объекта за пределы карты, вызывает утечку)

Менее очевидные причины утечки могут быть с любым объектом, которые созданы как func_door_rotating(en) или func_rot_button(en) и используют метки центра (origin helpers) (так например, при создании кнопки (func_rot_button) нужно создавать ось вращения, которая является меткой центра). С одной стороны объект (например сама кнопка) сам по себе может размещаться внутри карты, но метка центра (origin helper) снаружи, либо где-то пересекает границу карты, то это приведёт к утечке. Так если у Вас возникла ошибка утечка(leak) и vbsp смог генерировать pointfile (имя_карты.lin), то на месте указанном в файле реально объекта может и не быть. В этом случае необходимо искать метку центра(origin helper).

Один из способов узнать является ли метка центра (origin) источником ошибки:

  1. Загрузите pointfile (имя_карты.lin).
  2. Найдите конечные точки в pointfile (т.е. следуйте за красной линией до конца, методика поиска расписаны выше).
  3. Выберите Select All из меню Edit Menu.
  4. Убедитесь что в меню вида View Menu выбран пункт Показать метки(Show Helpers)(en).
  5. Если Вы увидели после этого объект типа метка центра(origin helper) при загруженном pointfile, то значит проблема именно в этом.

Если у Вас утечку вызывает именно метка центра(origin helper), то вы можете выбрать этот объект и вручную переместить его внутрь карты, используйте для этого команду Center Origins(en) из меню Tools Menu, или щёлкните правой кнопкой мыши по метке центра(origin helper) и выберите Center on entity.

Неправильное размещение меток центра обычно происходят, когда объект (например func_rot_button(en)) с одним из меткой центра (origin helper) перемещается в режиме Тела(Solids)(en). Перемещение объёмного элемента мира(en) в режиме Тела(Solids)(en) не перемещает метки центра(origin helpers).

Прозрачная геометрия

Существует частный случай, когда ваша геометрия может полностью закрывать все зазоры карты и тем не менее утечка будет постоянно появляться, даже если у Вас нет абсолютно ни одного объекта вокруг места утечки. Если загрузка pointfile Вам не помогла, то скорее всего это именно тот случай. Загрузив pointfile Вы увидите что, красная линия будет проходить через некоторые элементы. Причина довольно проста - скорее всего у Вас одна из сторон элемента текстурирована полупрозрачным материалом. В такой ситуации этот элемент не будет закрывать эту часть карты, и следовательно это будет являться зазором. В большинстве случаев, это также вызовет проблемы с граничащими с этими элементами ареапорталами (areaportals), которые также вследствие этого не смогут изолировать карту от пустоты. Помните, что стороны элемента с текстурами могут быть расположены где угодно, даже между другими элементами.

Func_viscluster

Func_viscluster(en) can also cause leaks when they cross areaportal surfaces, or are too close to them. Disabling all func_visclusters and compiling to see if the leak is gone should be done, at least as last resort.

Нужно сделать: How do you actually fix this?

Мнимые утечки

Although very rare, it is possible VBSP reports false leaks in your level. If you are sure that there should not be a leak reported by VBSP, copy your map and paste it into a fresh new map file. If it compiles fine, then your old file could have been corrupted.

Отутствие каких либо объектов на карте

Not having any type of entity inside the level will cause a leak. This is why pointfiles originate at an entity, because VBSP uses entities as a reference point for what is the inside of a map. Your map should always at least have a spawn entity(en) in it.


Пустой func_detail

Объект func_detail(en) не содержащий элементов мира, также приводит к утечке, которую трудно обнаружить, если не знать, что выполнялись операции с объектом func_detail(en).

Ситуации, когда утечка не происходит

Существует ряд ситуаций, которые на самом деле не приводят к утечке, даже если кажется, что объект расположен за пределами карты.

Вхождения

Instances are not entities - during loading, their contents are merged into the map. This means brushes inside an instance can seal a map, and the location of the actual func_instance(en) entity is not important, as long as any entities in the instance get placed inside the map.

Только центры имеют значение

Only the origin of the entity is considered when looking for leaks. The actual geometry of a brush or model can be partially or entirely inside the void, as long as the origin point is inside the map. Of course no lights are able to reach the void, so these entities should probably be unlit or invisible.

Объекты мира в центре и внутри элементов мира

Entities with their origin at exactly 0 0 0, or with their origin inside a solid brush do not leak. They are effectively ignored when determining the inside and outside of the level.

Заключение: Как говорится легче болезнь предупредить, чем её лечить!

Использование pointfile инструментов делает поиск утечек более простым, а ещё более простое решение и очевидное - это предотвращение утечки. В первую очередь убедитесь, что элементы привязаны к сетке, т.к. создание геометрии карты по сетке исключит возникновение зазоров при стыковке элементов. Также не забывайте, что при создании карты прежде чем её усложнять объектами и дополнительной геометрией - проверьте её на утечку, т.к. потом искать когда на карте будет куча всяких объектов крайне затруднительно.