Hint brush/ru

From Valve Developer Community
Jump to: navigation, search
Toolshint.gif

Hint-плоскости используются для разделения вис-листьев во время компиляции, и, как таковые, являются средством оптимизации на стадии Vis-компилирования карты.

Обычно, их называют хинт-брашами, поскольку они размещаются на карте как обычные браши. Хинт-плоскость задаётся стороной браша, покрытой текстурой tools/toolshint. Несколько хинт-поверхностей можно задать, покрыв ими несколько сторон как одного, так и нескольких брашей. Остальные стороны браша, которые не работают как хинты, могут быть покрыты текстурой tools/toolsskip; эти грани будут проигнорированы компилятором.

Хинты автоматически привязываются к своей вис-группе, так что вы легко можете скрыть их.

Зачем и когда разрезать листья

Note.pngПримечание:Изучение работы листьев поможет в понимании данной статьи.

Иногда, некоторые листья предпочтительнее других в силу своей формы, из-за которой их видимость уменьшается. Каждый раз, когда лист не виден, его содержимое не прорисовывается, ускоряя графику.

Следующие иллюстрации показывают важность нарезки листьев, и, в то же время, предлагают примеры того, где хинты полезны.

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

Пример карты sdk_hints.vmf, показывающей игроков слева и модели справа, разделенные стеной.

Когда игрок находится в одном из двух player_starts, движок должен решить, какие браши (трубы) справа от стены необходимо прорисовывать. Это происходит потому, что vbsp.exe не может эффективно разделить вашу карту на листья:

Без хинтов, vbsp создает листья вплоть до потолка.

Поскольку листья очень высокие и простираются до потолка, лист слева (с игроками) напрямую "видит" лист с трубами справа. Таким образом, лист и содержимое (трубы) будут прорисованы. Это обидно, поскольку игрок не видит трубы напрямую (они находятся за стеной в центре). Мы используем хинты, чтобы показать процесс создания листьев.

Один горизонтальный хинт создает несколько листьев, и два листа по обе стороны стены не будут видеть друг друга.

Белая линия - это сторона браша с текстурой tools/toolshint. Он заставляет vbsp разделить нашу карту на три листа. Теперь нет прямой линии между листьями с игроками и трубами. Вот в чем суть хинтования.

Скайбоксы иногда завышены, чтобы игрок мог видеть все здания в городе, находящемся на одном листе (как в нашем примере). Это тоже хорошая ситуация, когда можно использовать хинты для ограничения видимости.

Угловые хинты

Без хинтов, в этом помещении будет рендериться любой угол, когда стоите в противоположном углу.

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

Можно подумать, что vbsp убежден, что игроки не видят объекты, принадлежащие другому игроку. Это не так. Он разделит это пространство на два листа, либо обрежет листья вдоль коричневой или розовой линий (в зависимости от стороны браша).

В любом случае, оба угловых листа напрямую видят друг друга, так что содержимое каждого угла будет отрисовываться во время нахождения в другом углу.

Добавление углового хинт-браша создаст на листах угол, так что они не будут видеть друг друга.

Эту ситуацию можно значительно улучшить, и разделить наш уровень на три листа, поместив хинт в угол, (создав в целом три листа вместо двух), но лишь убедившись, что объекты одного игрока не будут видимы другим.

Здесь нет прямой видимости между красным и коричневым листами, избегая ненужной отрисовки. Однако, если один игрок перейдет на зеленый лист, он будет видеть их оба - и свои и чужие объекты. Вы не сможете прекратить это с помощью хинтов. Это можно сделать либо перекройкой макета уровня, либо с помощью таких методов, какие описаны, например, в Управление видимостью геометрии и временем компиляции.

Еще примеры

Различные способы использования хинтов. Works - работает, does not work - не работает, no hints needed - хинты не нужны.

Вот несколько примеров того, где и как использовать хинты. Во всех случаях цель - скрыть зеленых игроков друг от друга. Верхние три работают как надо. Левая иллюстрация показывает, что пока угол хинт-браша > 180°, игроки не будут "видеть" листья соседа, потому как нет прямой видимости между их листьями. Нижний слева пример показывает, что происходит, если угол меньше 180°. Можно легко провести прямую линию от листа к листу, приводящую к нерабочим хинтам.

Когда угол в коридоре 180°, как на верхней средней картинке, двух хинтов будет достаточно. Фактически, они могут быть даже ближе к игрокам, но это снизило бы их эффективность ("за углом" будет отрисовано больше материала). В среднем нижнем примере, хинты были нарисованы ниже и vbsp вынужден обрезать вис-лист до верха, потому что вис-листы не могут быть вогнутыми. Не зависимо от того, как vbsp режет этот угол, хинты всегда будут работать менее эффективно и создавать лишние листы (больше работы для vvis). Например, левый игрок может видеть листы 1 и 2 (те же поверхности, что и выше), но правый игрок увидит все три пронумерованных листа (больше, чем в верхнем примере).

Две правых картинки показывают упрощенные вещи. Предпочтительным является наличие одного хинта, как в верхнем примере. И, очевидно, хинты не должны использоваться, когда они не нужны, как на нижней картинке. Как показано, vbsp не может создавать листья, которые позволяют обоим игрокам видеть друг друга, поэтому нет необходимости использовать для этого хинты (конечно, хинты можно использовать, чтобы скрыть части коридоров). В этом же примере средняя стена ни в коем случае не должна быть браш-деталью. Геометрические детали не создают вис-листов и игнорируются vvis. Он будет думать, что игроки видят друг друга, а это не то, что нам нужно. vbsp даже может сделать так, что оба игрока окажутся на одном листе.

В целом, поскольку хинты не оказывают прямого влияния на отрисовку во время игры, при грамотном использовании они являются основным способом ускорения вашей карты и управления видимостью.

Хинты для упрощения

Наконец, хинты можно использовать для упрощения карты. Иногда vbsp нарезает листьев больше, чем необходимо. Это увеличивает время компиляции. Хинты могут использоваться для противодействия этому. Например, хинты могут быть помещены в дверные проемы, чтобы предотвратить разрезание комнат, которые они соединяют. Или, например, если вы получаете сообщение об ошибке, что какой-то вис-лист образовывает слишком много других вис-листов, хинты могу использоваться для сокращения количества углов.

Note.pngПримечание:Вис-листы всегда разрезаются каждые 1024 единицы (красные и синие линии в окнах 2D-вида).

См. также

Примеры

  • sourcesdk_content\hl2\mapsrc\sdk_hints.vmf - пример карты, включенной в Source SDK.