Ru/Hint brush: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
m (Converted {{otherlang2}} to {{lang}}.)
m (Multipage removal)
 
(13 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{lang|Hint brush|title=Hint-браши}}
{{LanguageBar|title = Hint-браши}}
Hint-плоскости используются для того, чтобы разрезать [[visleaves|листья]] в процессе компиляции, и являются средством оптимизации на стадии [[Vvis|Vis]]-компилирования карты.
{{back|Tool textures#hint|Tool Textures}}


Обычно, они упоминаются как обычные хинт-[[brush|браши]], поскольку помещаются в мир карты как обычные браши. Хинт-плоскости определяются стороной браша, покрытой текстурой <code>tools/[[tool textures#hint|toolshint]]</code>. Несколько хинт-поверхностей определяются несколькими окрашенными сторонами одного или нескольких брашей. Остальные стороны браша могут быть покрыты текстурой <code>tools/[[tool textures#skip|toolsskip]]</code>; эти грани будут проигнорированы компилятором.
[[File:Toolshint.gif|left|link=]]Hint-плоскости используются для разделения {{L|visleaves|вис-листьев}} во время компиляции, и, как таковые, являются средством оптимизации на стадии {{L|Vvis|Vis}}-компилирования карты.
 
Обычно, их называют хинт-{{L|brush|брашами}}, поскольку они размещаются на карте как обычные браши. Хинт-плоскость задаётся стороной браша, покрытой текстурой <code>tools/[[tool textures#hint|toolshint]]</code>. Несколько хинт-поверхностей можно задать, покрыв ими несколько сторон как одного, так и нескольких брашей. Остальные стороны браша, которые не работают как хинты, могут быть покрыты текстурой <code>tools/[[tool textures#skip|toolsskip]]</code>; эти грани будут проигнорированы компилятором.


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


== Зачем и когда разрезать листья ==
== Зачем и когда разрезать листья ==
{{note:ru|Изучение работы [[visleaves|листьев]] поможет в понимании данной статьи.}}
{{Note|Изучение работы {{L|visleaves|листьев}} поможет в понимании данной статьи.}}


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


Следующие иллюстрации показывают важность нарезки листьев, и, в то же время, предлагают примеры того, где хинты полезны.
Следующие иллюстрации показывают важность нарезки листьев, и, в то же время, предлагают примеры того, где хинты полезны.
Line 15: Line 17:
Первый пример почти такой же, как и на [[#Examples|карте SDK]]. Это комната с игроками и трубами, разделенная стеной:
Первый пример почти такой же, как и на [[#Examples|карте SDK]]. Это комната с игроками и трубами, разделенная стеной:


[[Image:Hint example1.jpg|frame|left|caption|Пример карты sdk_hints.vmf, показывающей игроков слева и модели справа, разделенные стеной.]]{{clr}}
[[File:Hint example1.jpg|frame|left|caption|Пример карты sdk_hints.vmf, показывающей игроков слева и модели справа, разделенные стеной.]]{{clr}}


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


[[Image:Hint example2.jpg|frame|left|caption|Без хинтов, vbsp создает листья вплоть до потолка.]]{{clr}}
[[File:Hint example2.jpg|frame|left|caption|Без хинтов, vbsp создает листья вплоть до потолка.]]{{clr}}


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


[[Image:Hint example3.jpg|frame|left|caption|Один горизонтальный хинт создает несколько листьев, и два листа по обе стороны стены не будут видеть друг друга.]]{{clr}}
[[File:Hint example3.jpg|frame|left|caption|Один горизонтальный хинт создает несколько листьев, и два листа по обе стороны стены не будут видеть друг друга.]]{{clr}}


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


[[Skybox:ru|Скайбоксы]] иногда завышены, чтобы игрок мог видеть все здания в городе, находящемся на одном листе (как в нашем примере). Это тоже хорошая ситуация, когда можно использовать хинты для ограничения видимости.
{{L|Skybox Basics|Скайбоксы}} иногда завышены, чтобы игрок мог видеть все здания в городе, находящемся на одном листе (как в нашем примере). Это тоже хорошая ситуация, когда можно использовать хинты для ограничения видимости.


== Угловые хинты ==
== Угловые хинты ==
[[Image:Hint example5.JPG|thumb|200px|right|caption|Без хинтов, в этом помещении будет рендериться любой угол, когда стоите в противоположном углу.]]
[[File:Hint example5.JPG|thumb|200px|right|caption|Без хинтов, в этом помещении будет рендериться любой угол, когда стоите в противоположном углу.]]


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


[[Image:Hint example4.jpg|thumb|200px|right|caption|Добавление углового хинт-браша создаст на листах угол, так что они не будут видеть друг друга.]]
[[File:Hint example4.jpg|thumb|200px|right|caption|Добавление углового хинт-браша создаст на листах угол, так что они не будут видеть друг друга.]]


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


Здесь нет прямой видимости между красным и коричневым листами, избегая ненужной отрисовки. Однако, если один игрок перейдет на зеленый лист, он будет видеть их оба - и свои и чужие объекты. Вы не сможете прекратить это с помощью хинтов. Это можно сделать либо перекройкой макета уровня, либо с помощью таких методов, какие описаны, например, в [[Controlling Geometry Visibility and Compile Times:ru|Управление видимостью геометрии и временем компиляции]].{{clr}}
Здесь нет прямой видимости между красным и коричневым листами, избегая ненужной отрисовки. Однако, если один игрок перейдет на зеленый лист, он будет видеть их оба - и свои и чужие объекты. Вы не сможете прекратить это с помощью хинтов. Это можно сделать либо перекройкой макета уровня, либо с помощью таких методов, какие описаны, например, в {{L|Controlling Geometry Visibility and Compile Times|Управление видимостью геометрии и временем компиляции}}.{{clr}}


== Еще примеры ==
== Еще примеры ==
[[Image:Hint example6.PNG|frame|caption|right|Различные способы использования хинтов.
[[File:Hint example6.PNG|frame|caption|right|Различные способы использования хинтов.
Works - работает, does not work - не работает, no hints needed - хинты не нужны.]]
Works - работает, does not work - не работает, no hints needed - хинты не нужны.]]


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


Когда угол в коридоре 180&deg;, как на верхней средней картинке, двух хинтов будет достаточно. Фактически, они могут быть даже ближе к игрокам, но это снизило бы их эффективность ("за углом" будет отрисовано больше материала). В среднем нижнем примере, хинты были нарисованы ниже и <code>vbsp</code> вынужден обрезать вис-лист до верха, потому что вис-листы не могут быть  [[concave|вогнутыми]]. Не зависимо от того, как <code>vbsp</code> режет этот угол, хинты всегда будут работать менее эффективно и создавать лишние листы (больше работы для <code>vvis</code>). Например, левый игрок может видеть листы 1 и 2  (те же поверхности, что и выше), но правый игрок увидит все три пронумерованных листа (больше, чем в верхнем примере).  
Когда угол в коридоре 180°, как на верхней средней картинке, двух хинтов будет достаточно. Фактически, они могут быть даже ближе к игрокам, но это снизило бы их эффективность ("за углом" будет отрисовано больше материала). В среднем нижнем примере, хинты были нарисованы ниже и <code>vbsp</code> вынужден обрезать вис-лист до верха, потому что вис-листы не могут быть  {{L|concave|вогнутыми}}. Не зависимо от того, как <code>vbsp</code> режет этот угол, хинты всегда будут работать менее эффективно и создавать лишние листы (больше работы для <code>vvis</code>). Например, левый игрок может видеть листы 1 и 2  (те же поверхности, что и выше), но правый игрок увидит все три пронумерованных листа (больше, чем в верхнем примере).  


Две правых картинки показывают упрощенные вещи. Предпочтительным является наличие одного хинта, как в верхнем примере. И, очевидно, хинты не должны использоваться, когда они не нужны, как на нижней картинке. Как показано, <code>vbsp</code> не может создавать листья, которые позволяют обоим игрокам видеть друг друга, поэтому нет необходимости использовать для этого хинты (конечно, хинты можно использовать, чтобы скрыть части коридоров). В этом же примере средняя стена ''ни в коем случае'' не должна быть [[func detail|браш-деталью]]. Геометрические детали не создают вис-листов и игнорируются <code>vvis</code>. Он будет думать, что игроки видят друг друга, а это не то, что нам нужно. <code>vbsp</code> даже может сделать так, что оба игрока окажутся на одном листе.
Две правых картинки показывают упрощенные вещи. Предпочтительным является наличие одного хинта, как в верхнем примере. И, очевидно, хинты не должны использоваться, когда они не нужны, как на нижней картинке. Как показано, <code>vbsp</code> не может создавать листья, которые позволяют обоим игрокам видеть друг друга, поэтому нет необходимости использовать для этого хинты (конечно, хинты можно использовать, чтобы скрыть части коридоров). В этом же примере средняя стена ''ни в коем случае'' не должна быть {{L|func detail|браш-деталью}}. Геометрические детали не создают вис-листов и игнорируются <code>vvis</code>. Он будет думать, что игроки видят друг друга, а это не то, что нам нужно. <code>vbsp</code> даже может сделать так, что оба игрока окажутся на одном листе.


В целом, поскольку хинты не оказывают прямого влияния на отрисовку во время игры, при грамотном использовании они являются '''основным способом ускорения вашей карты и управления видимостью.'''
В целом, поскольку хинты не оказывают прямого влияния на отрисовку во время игры, при грамотном использовании они являются '''основным способом ускорения вашей карты и управления видимостью.'''
Line 59: Line 61:
Наконец, хинты можно использовать для упрощения карты. Иногда <code>vbsp</code> нарезает листьев больше, чем необходимо. Это увеличивает время компиляции. Хинты могут использоваться для противодействия этому. Например, хинты могут быть помещены в дверные проемы, чтобы предотвратить разрезание комнат, которые они соединяют. Или, например, если вы получаете сообщение об ошибке, что какой-то вис-лист образовывает слишком много других вис-листов, хинты могу использоваться для сокращения количества углов.
Наконец, хинты можно использовать для упрощения карты. Иногда <code>vbsp</code> нарезает листьев больше, чем необходимо. Это увеличивает время компиляции. Хинты могут использоваться для противодействия этому. Например, хинты могут быть помещены в дверные проемы, чтобы предотвратить разрезание комнат, которые они соединяют. Или, например, если вы получаете сообщение об ошибке, что какой-то вис-лист образовывает слишком много других вис-листов, хинты могу использоваться для сокращения количества углов.


{{note:ru|Вис-листы всегда разрезаются каждые 1024 единицы (красные и синие линии в окнах 2D-вида).}}
{{Note|Вис-листы всегда разрезаются каждые 1024 единицы (красные и синие линии в окнах 2D-вида).}}


== См. также ==
== См. также ==
* [[Visibility optimization:ru|Оптимизация видимости]]
* {{L|VIS optimization|Оптимизация видимости}}
* [[Skip:ru|Текстура Skip]]
* {{L|Skip|Текстура Skip}}
* [[%compilehint]]
* {{L|%compilehint}}
* [[Optimization_(level_design):ru|Оптимизация (создание уровня)]]
* {{L|Optimization/Level Design|Оптимизация (создание уровня)}}


== Примеры ==
== Примеры ==
Line 71: Line 73:
[[Category:Glossary:ru|Глоссарий]]
[[Category:Glossary:ru|Глоссарий]]
[[Category:Level Design:ru|Создание уровня]]
[[Category:Level Design:ru|Создание уровня]]
{{ACategory|Level Design}}

Latest revision as of 17:25, 12 July 2024

English (en)Русский (ru)中文 (zh)Translate (Translate)
Tool Textures
Toolshint.gif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Еще примеры

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

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

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

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

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

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

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

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

См. также

Примеры

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