Утечка

From Valve Developer Community
Jump to: navigation, search
English Deutsch

Что такое утечка (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 утечки вызванной этой энтити.

Note:Часто энтити выводимая компилятором в лог не является причиной утечки. Удаление привет к появлению ошибки, в которой будет указана другая энтити, удаление не решает проблемы! Однако существует ситуация когда удаление энтити устраняет утечку: это когда энтити находится за границам уровня. Этот случай будет описан ниже в этой статье.
Note:Если ваша карта не содержит ни одной энтити, vbsp может сообщит об утечке, поскольку нет способа определить какая часть является интерьером уровня, а какая экстерьером.

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

Утечка на уровне имеет ряд негативных эффектов. Во первых, 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 (закрывать окно компиляции после нажатия клавиши):

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

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

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

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

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

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

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

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

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

Hammer Go To Coord.png

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

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

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

Энтити(Entities) размещённые за пределами уровня

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

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

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

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

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

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

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

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

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

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

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

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

An origin helper separated from its parent entity and moved outside the level will cause a leak. (Вспомогательный объект(origin helper) отделён от своего родителя и оказался перемещён за приделы уровня, что приведёт к ошибке утечки)

Менее очевидные причины утечки могут быть с любым энти, которые созданы как func_door_rotating или func_rot_button и использует вспомогательные объекты (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.
  5. Если вы увидели после этого объект типа origin helper при загруженном pointfile, то значит проблема именно в этом.

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

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

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

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

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

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