Эта статья документации для платформы "GoldSrc". Нажмите для получения дополнительной информации.
Эта статья документации для всего, что использует платформу Source. Нажмите для получения дополнительной информации.

Ru/VIS optimization: Difference between revisions

From Valve Developer Community
< Ru
Jump to navigation Jump to search
m (-autolang collapse)
 
(25 intermediate revisions by 9 users not shown)
Line 1: Line 1:
{{otherlang2
{{LanguageBar|title = Оптимизация видимости}}
|title=Оптимизация видимости
{{gldsrc topicon}} {{Source topicon}} {{ACategory|Hammer}} {{ACategory|Level_Design}}
|es=visibility_optimization:es
{{subpage|[[Optimization/Level_Design|Оптимизация (создание уровней)]]}}
|en=visibility_optimization
}}


Без "видимости", карта прорисовывает все предметы независимо от того, видит их игрок или нет. Очевидно, какие-то объекты нужно исключить из обработки, но как? Проверка каждого объекта на степень загрузки видео займет много времени.
Без {{L|VVIS|информации о видимости}}, всё на карте будет отрисовываться независимо от того, видит это игрок или нет. Очевидно, что количество объектов/элементов мира для обработки нужно ограничить, но как? Проверка действительной видимости игроку каждого объекта или поверхности занимает гораздо больше процессорного времени, чем непосредственно отрисовка этих объектов/элементов.


Движок игры должен создавать компромисс; Source - это модель [[Binary Space Partition]] на основе разработки [[Wikipedia:John D. Carmack|Джона Кармака]], реализованной в [[Wikipedia:Quake_(video_game)|Quake]]. Данная страница объясняет, как это работает и как этим манипулировать.
Игровыми платформами использует компромис; и {{gldsrc|2}} и {{Source|2}} используют {{L|BSP|модель двоичного разбиения пространства}} на основе разработки [[Wikipedia:ru:Кармак, Джон|Джона Кармака]], реализованной в [[w:ru:Quake|''Quake'']]. На этой странице объясняется, как это работает и как этим управлять.


==Листья==
== Области видимости ==
[[File:Visleaves.png|frame|left|Области в коридоре.]]


[[File:Visleaves.png|frame|left|Листья в коридоре.]]
Внутреннее (т.е. не занятое {{L|world brush|элементами карты мира}}) пространство карты мира разделяется на {{L|Visleaf|Области видимости}}. Видимость между этими 3-х мерными объёмами рассчитывается во время компиляции, и встраивается в BSP-файл для использования платформой игры. Как и элементы карты мира, области видимости всегда являются выпуклыми объёмами.


Интерьер (т.е. не занятое брашами [[world brush:ru|world brush]]) пространство карта BSP разделяет на листья [[Visleaf|visleaves]]. Видимость в этом 3-х мерном объеме рассчитывается во время компиляции, и встраивается в файл карты для использования движком. Как и браши, листья всегда выпуклые.
Рисунок слева показывает, как области видимости создаются в изгибах коридоров (промежутки между ними добавлены для наглядности). Тут нет прямой видимости между областями 1 и 3, поэтому, когда камера находится в одной части коридора, содержимое в другой части не отрисовывается. Игровой платформе оказывается достаточно просто определить это по встроенной в BSP-файл информации о видимости.


Рисунок слева показывает, как листья создаются в изгибах коридоров (промежутки между ними добавлены для ясности). Тут нет прямой видимости между листами 1 и 3, поэтому, когда камера находится в одном коридоре, содержимое другого не прорисовывается. Насколько это облегчает движок, видно по графику видимости, включенном в карту.
Но есть проблема с областью 2. Содержимое „всех трёх“ областей отрисовывается, когда камера находится внутри, усекая картинку [[:File:Frustum culling.png|конусообразно]], даже если левая стена полностью закрывает вид. У нас есть инструменты для преодоления этого, и мы их скоро рассмотрим, но имейте в виду, что решить проблему будет труднее ({{L|Expensive|тяжелой}}), нежели просто оптимально нарисовать сцену.


Но есть проблема с листом 2. Содержимое  "всех трех" листов прорисовывается, когда камера находится внутри, усекая картинку [[:File:Frustum culling.png|конусообразно]], даже если левая стена полностью закрывает вид. У нас есть инструменты для преодоления этого, и мы их скоро рассмотрим, но имейте в виду, что решить проблему будет труднее ([[expensive]]), нежели просто оптимально нарисовать сцену.
Постоянно имейте в виду, что {{L|Displacement|деформированные поверхности}}, {{L|Point entity|точечные объекты}} и {{L|Brush entity|объёмные объекты}} (включая [[#Браши-детали|Браши-детали]]), а также элементы карты с поверхностями {{ent|$translucent}} не влияют на области видимости. Создание {{L|world brush|элемента карты мира}} с текстурой [[Tool textures#nodraw|Nodraw]] „основано“ на этой проблеме: это типично для {{L|Displacement|деформированных поверхностей}}, созданных как деталь, покрывающая каркас обычных элементов карты.
{{Warning|Области видимости не будут создаваться, если на карте имеется {{L|Leak|утечка}}.}}
{{Tip|Области видимости разделяются через каждые 1024 {{L|unit|единицы}} в плоскости XY независимо от геометрии, таким образом разделяя большие пространства. Сетка {{L|Hammer|редактора карт}} помогает Вам учитывать это.}}
{{Note|Области видимости работают как по вертикали, так и по горизонтали. Тянутся с неба, проходят по улицам и опускаются в комнаты.}}


Постоянно имейте в виду, что [[displacement|дисплейсменты]], сущности [[Point entity|точка]] и [[Brush entity|браш]] (включая [[#Detail_brushes|detail brushes]]), а также браши с поверхностями  [[$translucent]] не влияют на листья. Создание браша [[world brush:ru|world brush]] с текстурой [[nodraw]] 'основано' на этой проблеме: это типично для дисплейсментов, созданных как деталь, покрывающая каркас обычных брашей.
=== Сокращение времени компиляции VIS ===
{{L|VVIS}} — это инструмент, который рассчитывает видимость между областями (в то время, как {{L|VBSP}} создает их). Расчёт не занимает и нескольких минут даже для сложных карт, но если время затянулось, то проделайте следующие шаги.


{{warning:ru|Листья не будут создаваться, если на карте имеется [[leak:ru|утечка]].}}
* Используйте [[#Браши-детали|Браши-детали]].
* Размещайте {{L|world brush}} строго по сетке. Размер сетки лучше всего выставить кратным двум.
* Используйте простые браши. Не вырезайте ({{L|carve}}), если не уверены в результате.
* Располагайте {{ent|func_viscluster}} {{hl2ep2|since}} на больших площадях с не загороженным видом. Листья в нем будут видеть друг друга.
* Не создавайте больших открытых пространств, которые игрок изначально не видит, если в этом нет необходимости. Используйте {{L|3D Skybox}}, чтобы уменьшить размер неба и создайте скелет брашей под {{L|displacement|дисплейсментами}}.


{{tip:ru|Листья режутся каждые 1024 [[unit|единицы]] в плоскости XY независимо от геометрии, таким образом разделяя большие пространства. Сетка Хаммера помогает вам учитывать это.}}
Помните, что время компиляции VIS и производительность в игре — две очень разные вещи. Вполне может быть, что длительная компиляция стоит своего результата.


{{note:ru|Листья работают как по вертикали, так и по горизонтали. Тянутся с неба, проходят по улицам и опускаются в комнаты.}}
=== Просмотр областей видимости ===
{{L|Orange Box}}-версия {{Hammer|4}} имеет новую функцию просмотра областей видимости в 3D-виде: ''Map > Load Portal File''. Он показывает грани соприкосновения областей жирными синими линиями. Это фантастический обучающий инструмент, и если Вы компилировали карту без VIS или RAD (перезагрузите файл портала, чтобы обновить экран), Вы сразу увидите изменения.


===Сокращение времени компиляции VIS===
Пользователи {{src06|4}} должны полагаться на приложение {{L|glview}}.
{{Tip|Чтобы стало еще яснее, используйте автоматическую {{L|Grouping and VisGrouping|группировку}}, которая удаляет из карты объекты, не блокирующие видимость — т.е. все, кроме „World Geometry“.}}


[[VVIS]] - это инструмент, который рассчитывает видимость между листьями (в то время, как [[VBSP]] создает их). Расчет не занимает и нескольких минут даже для сложных карт, но если время затянулось, то проделайте следующие шаги.
Для просмотра в игре, наберите в консоли {{L|console variable|переменную}} {{ent|mat_leafvis}}. <code>mat_leafvis 3</code> отчертит все области видимости в [[PVS]] {{en}}, в то время, как <code>mat_leafvis 1</code> будет очерчивать только области видимости, на которые смотрит камера. (Эта переменная является {{L|sv cheats|читом}}.)


* Используйте [[#Detail_brushes|detail brushes]].
Вы также можете проверить геометрию с помощью переменной консоли {{ent|mat_wireframe}}. <code>mat_wireframe 1</code> отобразит как полигоны, прорисованные в текущемt PVS. (Эта переменная также является читом.)
* Размещайте [[world brush]] строго по сетке. Размер сетки лучше всего выставить на два.
* Используйте простые браши. Не вырезайте ([[carve]]), если не уверены в результате.
* Располагайте {{EP2 add:ru|[[func_viscluster:ru|func_viscluster]]}} на больших площадях с не загороженным видом. Листья в нем будут видеть друг друга.
* Не создавайте больших открытых пространств, которые игрок изначально не видит, если в этом нет необходимости. Используйте [[3D Skybox]], чтобы уменьшить размер неба и создайте скелет брашей под [[displacement|дисплейсментами]].


Помните, что время компиляции VIS и производительность в игре - две очень разные вещи. Вполне может быть, что длительная компиляция стоит своего результата.
== Хинты ==
 
{{main|Hint brush|Hint-браши}}
===Просмотр листьев===
[[File:Toolshint.gif|right|link=Hint brush|<code>tools\toolshint</code>]]
 
[[Orange Box]]-версия Хаммера имеет новую функцию просмотра листьев в 3D-виде: ''Map > Load Portal File''. Он показывает грани соприкосновения листьев жирными синими линиями. Это фантастический обучающий инструмент, и если вы компилировали карту без VIS или RAD (перезагрузите файл портала чтобы обновить экран), вы сразу увидите изменения.
 
Пользователи [[Episode One (engine branch)|Episode One]] должны полагаться на приложение [[glview]].
 
{{tip:ru|Чтобы стало еще яснее, используйте автоматическую [[visgroup|группировку]], которая удаляет из карты объекты, не блокирующие видимость, - т.е. все, кроме "World Geometry".}}
 
Для просмотра в игре, наберите в консоли [[console variable|переменную]] "[[mat_leafvis]]". <code>mat_leafvis 3</code> отчертит все вис-листья в [[PVS]], в то время, как <code>mat_leafvis 1</code> будет очерчивать только листья, на которые смотрит камера. (Эта переменная является [[sv_cheats|читом]].)
 
Вы также можете проверить геометрию с помощью переменной консоли [[mat_wireframe]]. <code>mat_wireframe 1</code> отобразит как полигоны, прорисованные в текущемt [[PVS]]. (Эта переменная также является [[sv_cheats|читом]].)
 
==Хинты==
 
[[File:Toolshint.gif|right|link=Hint brush|tools\toolshint]]
[[File:Visleaves-hint.png|frame|left|Все листья рисуются одновременно, пока нет хинта.]]
[[File:Visleaves-hint.png|frame|left|Все листья рисуются одновременно, пока нет хинта.]]


К сожалению, листья не всегда выходят так хорошо, как показано в первом примере. Рассмотрим альтернативный макет слева (на практике, он будет сконфигурирован как на первом рисунке, но  пока  отложим это в сторону): в этом примере листья могут видеть друг друга, что приводит к прорисовке всей зоны сразу, что не очень хорошо. Подробнее здесь: '''''[[Hint brush|Хинты]]'''''.
К сожалению, листья не всегда выходят так хорошо, как показано в первом примере. Рассмотрим альтернативный макет слева (на практике, он будет сконфигурирован как на первом рисунке, но  пока  отложим это в сторону): в этом примере листья могут видеть друг друга, что приводит к прорисовке всей зоны сразу, что не очень хорошо. Подробнее здесь: '''{{L|Hint brush|Хинты}}'''.


Хинт - это брашевая поверхность с [[Applying Materials|текстурой]] специального материала <code>tools\toolshint</code>, которая нарезает листья на двух пересечениях (поверхности, которые ''не'' разрезают листья, должны быть покрыты текстурой <code>tools\toolsskip</code>). В нашем примере мы поставили хинт там, где проходит фиолетовая линия, которая режет листы 1 и 3 такой же формы, как показано в первом примере.
Хинт это брашевая поверхность с {{L|Applying Materials|текстурой}} специального материала <code>tools\toolshint</code>, которая нарезает листья на двух пересечениях (поверхности, которые ''не'' разрезают листья, должны быть покрыты текстурой <code>tools\toolsskip</code>). В нашем примере мы поставили хинт там, где проходит фиолетовая линия, которая режет листы 1 и 3 такой же формы, как показано в первом примере.


Это не дает листам соединиться, так что в итоге появятся три отдельных листа справа. К счастью, это небольшая проблема.
Это не дает листам соединиться, так что в итоге появятся три отдельных листа справа. К счастью, это небольшая проблема.
 
{{Tip|Хорошая мысль разделять хинтами зоны с [[expensive|тяжелой]] {{en}} и {{L|Cheap|легкой}} графикой на одном листе, если это приведет к сокращению времени прорисовки пространства.}}
{{tip:ru|Хорошая мысль - разделять хинтами зоны с [[expensive|тяжелой]] и [[cheap|легкой]] графикой на одном листе, если это приведет к сокращению времени прорисовки пространства.}}


==Браши-детали==
==Браши-детали==
 
{{main:ru|func_detail}}
Как сказано выше, листья формируются вокруг обычных брашей. Но что делать, если вам этого ''не'' нужно? Если ваши браши постоянно на виду (например, статуя, отдельно стоящая небольшая стена), нет никакого смысла создавать листья вокруг них.
Как сказано выше, листья формируются вокруг обычных брашей. Но что делать, если вам этого ''не'' нужно? Если ваши браши постоянно на виду (например, статуя, отдельно стоящая небольшая стена), нет никакого смысла создавать листья вокруг них.


В таких ситуациях вам поможет '''''[[func_detail]]'''''. Это [[internal entity|внутренняя сущность]], которая заставляет компилятор игнорировать браши во время расчета пространства, не влияя на него. [[func_detail#Good_candidates|Это не редкость, когда большие участки карт делают деталью]].
В таких ситуациях вам поможет '''{{ent|func_detail}}'''. Это {{LCategory|Internal entities|внутренняя сущность}}, которая заставляет компилятор игнорировать браши во время расчета пространства, не влияя на него. [[func_detail#Good_candidates|Это не редкость, когда большие участки карт делают деталью]] {{en}}.


== Поверхности Nodraw ==
== Поверхности Nodraw ==
 
{{Main:ru|Tool textures#Nodraw|Nodraw}}
[[File:toolsnodraw.gif|right|link=nodraw|tools\toolsnodraw]]
[[File:toolsnodraw.gif|right|link=nodraw|tools\toolsnodraw]]


Если игрок не может видеть поверхность браша без чита или режима спектатора, хорошая мысль применить специальный материал '''nodraw'''. Нодро удаляет все поверхности во время компиляции без ущерба для видимости, что уменьшает время рендеринга, убирает необходимость рассчитывать [[lightmap|карту освещенности]], уменьшает вес файла.
Если игрок не может видеть поверхность браша без чита или режима спектатора, хорошая мысль применить специальный материал '''Nodraw'''. Нодро удаляет все поверхности во время компиляции без ущерба для видимости, что уменьшает время рендеринга, убирает необходимость рассчитывать {{L|lightmap|карту освещенности}}, уменьшает вес файла.


Вам ''нет'' необходимости применять нодро к поверхностям, соприкасающимся с пустотой (т.е. за пределами карты) или брашам, чьи поверхности тесно соприкасаются, будучи одой сущностью (когда весь мир - одна большая сущность). См. [[Brush:ru|Браши]].
Вам ''нет'' необходимости применять нодро к поверхностям, соприкасающимся с пустотой (т.е. за пределами карты) или брашам, чьи поверхности тесно соприкасаются, будучи одой сущностью (когда весь мир одна большая сущность). См. {{L|Brush|Браши}}.


==Ареапорталы==
==Ареапорталы==
 
{{main:ru|Areaportal|Ареапорталы}}
[[File:Toolsareaportal.gif|right|link=Areaportal|tools\toolsareaportal]]
[[File:Toolsareaportal.gif|right|link=Areaportal|tools\toolsareaportal]]


Line 86: Line 76:
На изображении слева все листья видят друг друга, и в этот раз хинты мало что могут сделать.
На изображении слева все листья видят друг друга, и в этот раз хинты мало что могут сделать.


В такой ситуации мы должны создать '''''[[Areaportal|ареапорталы]]''''' в выбранном проеме. Они ограничивают угол обзора объектов за своей линией, сквозь них движок не "видит" ничего и производительность тем выше, чем больше объектов закрывает ареапортал.
В такой ситуации мы должны создать '''{{L|Areaportal|ареапорталы}}''' {{en}} в выбранном проеме. Они ограничивают угол обзора объектов за своей линией, сквозь них движок не „видит“ ничего и производительность тем выше, чем больше объектов закрывает ареапортал.


Рисунок показывает ареапорталы в каждом проеме, но четыре портала скорее всего больше снизят производительность, чем принесут пользу. Ваша стратегия зависит от степени [[Budget|загрузки]] каждой зоны, и чаще всего лучше поставить один ареапортал в коридоре справа.
Рисунок показывает ареапорталы в каждом проеме, но четыре портала скорее всего больше снизят производительность, чем принесут пользу. Ваша стратегия зависит от степени {{L|Budget|загрузки}} каждой зоны, и чаще всего лучше поставить один ареапортал в коридоре справа.


(В этой ситуации ''можно'' использовать хинты для ограничения видимости, но очень осторожно и с точными углами, которые определенно влияют на производительность. Если за хинтами в комнате вы ничего не видите, значит надо ставить ареапортал!)
(В этой ситуации ''можно'' использовать хинты для ограничения видимости, но очень осторожно и с точными углами, которые определенно влияют на производительность. Если за хинтами в комнате вы ничего не видите, значит надо ставить ареапортал!)
 
{{Tip|Ареапорталы весьма полезны, так как они полностью закрыты и {{L|cheap|облегчают}} визуализацию. Хорошая мысль - вставлять ареапорталы в каждое окно и каждую дверь вашей карты, чтобы они автоматически выполняли свою функцию.}}
{{tip:ru|Ареапорталы весьма полезны, так как они полностью закрыты и [[cheap|облегчают]] визуализацию. Хорошая мысль - вставлять ареапорталы в каждое окно и каждую дверь вашей карты, чтобы они автоматически выполняли свою функцию.}}
{{Note|Ареапорталы не учитывают объекты ''перед'' собой.}}
 
{{warning|При неправильной установке ареапорталы могут вызывать проблемы, {{L|Areaportal|так что не забудьте внимательно прочитать о них}}.}}
{{note:ru|Ареапорталы не учитывают объекты ''перед'' собой.}}
 
{{warning:ru|При неправильной установке ареапорталы могут вызывать проблемы, [[Areaportal|так что не забудьте внимательно прочитать о них]].}}


== Окклюдеры ==
== Окклюдеры ==
 
{{main:ru|func_occluder|func_occluder}}
[[File:Toolsoccluder.gif|right|link=func_occluder|tools\toolsoccluder]]
[[File:Toolsoccluder.gif|right|link=func_occluder|tools\toolsoccluder]]


Иногда требуется блокировать видимость способом, который не позволяют листья: перед вами разрушаемая стена, за которой находится несколько "тяжелых" моделей персонажей. Вам не хочется прорисовывать модели, если они не попадают в поле зрения, но сделать это без брашей, разрезающих листья, нельзя.
Иногда требуется блокировать видимость способом, который не позволяют листья: перед вами разрушаемая стена, за которой находится несколько „тяжелых“ моделей персонажей. Вам не хочется прорисовывать модели, если они не попадают в поле зрения, но сделать это без брашей, разрезающих листья, нельзя.


'''''[[func_occluder|Окклюдер]]''''' - то, что надо. Это браш, который скрывает модели (не браши, увы) позади себя, будучи включенным, как и ареапортал. По понятным причинам, он должен целиком находиться внутри непрозрачного объекта.
'''{{L|func_occluder|Окклюдер}}''' {{en}} — то, что надо. Это браш, который скрывает модели (не браши, увы) позади себя, будучи включенным, как и ареапортал. По понятным причинам, он должен целиком находиться внутри непрозрачного объекта.


== Расстояние прорисовки ==
== Расстояние прорисовки ==
Если вы имеете дело с большим не закрытым пространством, то все, что можно сделать, чтобы скрыть низкую детализацию прорисовки, это использовать [[env_fog_controller|туман]] {{en}}. Настройка расстояния прорисовки в ''Map > Properties > Far z_clip plane''.


Если вы имеете дело с большим не закрытым пространством, то все, что можно сделать, чтобы скрыть низкую детализацию прорисовки, это использовать  [[env_fog_controller|туман]]. Настройка расстояния прорисовки в ''Map > Properties > Far z_clip plane''.
Расстояние прорисовки также может применяться к пропам, например {{ent|prop_static}}, со [[keyvalue|значениями]] {{en}} <code>Start Fade Dist/Pixels</code> и <code>End Fade Dist/Pixels</code>. Как видно из названия, эти значения представляют собой расстояние либо в единицах, либо в пикселях '''исчезающего пространства на экране''' KV.
 
Расстояние прорисовки также может применяться к пропам, например [[prop_static]], со [[keyvalue|значениями]] '''Start Fade Dist/Pixels''' и '''End Fade Dist/Pixels'''. Как видно из названия, эти значения представляют собой расстояние либо в единицах, либо в пикселях '''исчезающего пространства на экране''' KV.


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


<code>[[func_lod]]</code> - это специальная брашевая сущность, которая дает исчезновение. Однако, вы не можете связывать с ним браши и другие сущности!
{{ent|func_lod}} — это специальная брашевая сущность, которая дает исчезновение. Однако, вы не можете связывать с ним браши и другие сущности!


== Примеры карт ==
== Примеры карт ==
* <code>sourcesdk_content\hl2\mapsrc\</code>
* <code>sourcesdk_content\hl2\mapsrc\</code>
** <code>sdk_func_detail.vmf</code>
** <code>sdk_func_detail.vmf</code>
** <code>sdk_hints.vmf</code>
** <code>sdk_hints.vmf</code>
** <code>sdk_occluders.vmf</code>
** <code>sdk_occluders.vmf</code>
----
= См. также =
 
* {{ent|func_lod}} (Для повышения производительности детали не должны прорисовываться далеко.)
'''''[[Optimization (level design)|<< Return to Optimization (level design)]]'''''
 
[[Category:Level Design]]
 
= See Also =
 
* [[Func_lod]] (World detail that doesn't need to be drawn far away, for performance reasons.)

Latest revision as of 16:34, 6 August 2024

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

Без информации о видимости(en), всё на карте будет отрисовываться независимо от того, видит это игрок или нет. Очевидно, что количество объектов/элементов мира для обработки нужно ограничить, но как? Проверка действительной видимости игроку каждого объекта или поверхности занимает гораздо больше процессорного времени, чем непосредственно отрисовка этих объектов/элементов.

Игровыми платформами использует компромис; и GoldSrc GoldSrc и Source Source используют модель двоичного разбиения пространства(en) на основе разработки Джона Кармака, реализованной в Quake. На этой странице объясняется, как это работает и как этим управлять.

Области видимости

Области в коридоре.

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

Рисунок слева показывает, как области видимости создаются в изгибах коридоров (промежутки между ними добавлены для наглядности). Тут нет прямой видимости между областями 1 и 3, поэтому, когда камера находится в одной части коридора, содержимое в другой части не отрисовывается. Игровой платформе оказывается достаточно просто определить это по встроенной в BSP-файл информации о видимости.

Но есть проблема с областью 2. Содержимое „всех трёх“ областей отрисовывается, когда камера находится внутри, усекая картинку конусообразно, даже если левая стена полностью закрывает вид. У нас есть инструменты для преодоления этого, и мы их скоро рассмотрим, но имейте в виду, что решить проблему будет труднее (тяжелой(en)), нежели просто оптимально нарисовать сцену.

Постоянно имейте в виду, что деформированные поверхности(en), точечные объекты(en) и объёмные объекты(en) (включая Браши-детали), а также элементы карты с поверхностями $translucent не влияют на области видимости. Создание элемента карты мира(en) с текстурой Nodraw „основано“ на этой проблеме: это типично для деформированных поверхностей(en), созданных как деталь, покрывающая каркас обычных элементов карты.

Warning.pngПредупреждение:Области видимости не будут создаваться, если на карте имеется утечка(en).
Tip.pngСовет:Области видимости разделяются через каждые 1024 единицы(en) в плоскости XY независимо от геометрии, таким образом разделяя большие пространства. Сетка редактора карт(en) помогает Вам учитывать это.
Note.pngПримечание:Области видимости работают как по вертикали, так и по горизонтали. Тянутся с неба, проходят по улицам и опускаются в комнаты.

Сокращение времени компиляции VIS

VVIS(en) — это инструмент, который рассчитывает видимость между областями (в то время, как VBSP(en) создает их). Расчёт не занимает и нескольких минут даже для сложных карт, но если время затянулось, то проделайте следующие шаги.

  • Используйте Браши-детали.
  • Размещайте world brush(en) строго по сетке. Размер сетки лучше всего выставить кратным двум.
  • Используйте простые браши. Не вырезайте (carve(en)), если не уверены в результате.
  • Располагайте func_viscluster (Во всех играх начиная с Half-Life 2: Episode Two) на больших площадях с не загороженным видом. Листья в нем будут видеть друг друга.
  • Не создавайте больших открытых пространств, которые игрок изначально не видит, если в этом нет необходимости. Используйте 3D Skybox(en), чтобы уменьшить размер неба и создайте скелет брашей под дисплейсментами(en).

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

Просмотр областей видимости

Orange Box(en)-версия Hammer Hammer имеет новую функцию просмотра областей видимости в 3D-виде: Map > Load Portal File. Он показывает грани соприкосновения областей жирными синими линиями. Это фантастический обучающий инструмент, и если Вы компилировали карту без VIS или RAD (перезагрузите файл портала, чтобы обновить экран), Вы сразу увидите изменения.

Пользователи Source 2006 Source 2006 должны полагаться на приложение glview(en).

Tip.pngСовет:Чтобы стало еще яснее, используйте автоматическую группировку(en), которая удаляет из карты объекты, не блокирующие видимость — т.е. все, кроме „World Geometry“.

Для просмотра в игре, наберите в консоли переменную(en) mat_leafvis. mat_leafvis 3 отчертит все области видимости в PVS English, в то время, как mat_leafvis 1 будет очерчивать только области видимости, на которые смотрит камера. (Эта переменная является читом(en).)

Вы также можете проверить геометрию с помощью переменной консоли mat_wireframe. mat_wireframe 1 отобразит как полигоны, прорисованные в текущемt PVS. (Эта переменная также является читом.)

Хинты

Основная статья:  Hint-браши
tools\toolshint
Все листья рисуются одновременно, пока нет хинта.

К сожалению, листья не всегда выходят так хорошо, как показано в первом примере. Рассмотрим альтернативный макет слева (на практике, он будет сконфигурирован как на первом рисунке, но пока отложим это в сторону): в этом примере листья могут видеть друг друга, что приводит к прорисовке всей зоны сразу, что не очень хорошо. Подробнее здесь: Хинты(en).

Хинт — это брашевая поверхность с текстурой(en) специального материала tools\toolshint, которая нарезает листья на двух пересечениях (поверхности, которые не разрезают листья, должны быть покрыты текстурой tools\toolsskip). В нашем примере мы поставили хинт там, где проходит фиолетовая линия, которая режет листы 1 и 3 такой же формы, как показано в первом примере.

Это не дает листам соединиться, так что в итоге появятся три отдельных листа справа. К счастью, это небольшая проблема.

Tip.pngСовет:Хорошая мысль — разделять хинтами зоны с тяжелой English и легкой(en) графикой на одном листе, если это приведет к сокращению времени прорисовки пространства.

Браши-детали

Основная статья: func_detail

Как сказано выше, листья формируются вокруг обычных брашей. Но что делать, если вам этого не нужно? Если ваши браши постоянно на виду (например, статуя, отдельно стоящая небольшая стена), нет никакого смысла создавать листья вокруг них.

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

Поверхности Nodraw

Основная статья: Nodraw
tools\toolsnodraw

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

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

Ареапорталы

Основная статья: Ареапорталы
tools\toolsareaportal
Зеленоватые линии показывают удобные места для ареапорталов.

На изображении слева все листья видят друг друга, и в этот раз хинты мало что могут сделать.

В такой ситуации мы должны создать ареапорталы(en) English в выбранном проеме. Они ограничивают угол обзора объектов за своей линией, сквозь них движок не „видит“ ничего и производительность тем выше, чем больше объектов закрывает ареапортал.

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

(В этой ситуации можно использовать хинты для ограничения видимости, но очень осторожно и с точными углами, которые определенно влияют на производительность. Если за хинтами в комнате вы ничего не видите, значит надо ставить ареапортал!)

Tip.pngСовет:Ареапорталы весьма полезны, так как они полностью закрыты и облегчают(en) визуализацию. Хорошая мысль - вставлять ареапорталы в каждое окно и каждую дверь вашей карты, чтобы они автоматически выполняли свою функцию.
Note.pngПримечание:Ареапорталы не учитывают объекты перед собой.
Warning.pngПредупреждение:При неправильной установке ареапорталы могут вызывать проблемы, так что не забудьте внимательно прочитать о них(en).

Окклюдеры

Основная статья: func_occluder
tools\toolsoccluder

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

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

Расстояние прорисовки

Если вы имеете дело с большим не закрытым пространством, то все, что можно сделать, чтобы скрыть низкую детализацию прорисовки, это использовать туман English. Настройка расстояния прорисовки в Map > Properties > Far z_clip plane.

Расстояние прорисовки также может применяться к пропам, например prop_static, со значениями English Start Fade Dist/Pixels и End Fade Dist/Pixels. Как видно из названия, эти значения представляют собой расстояние либо в единицах, либо в пикселях исчезающего пространства на экране KV.

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

func_lod — это специальная брашевая сущность, которая дает исчезновение. Однако, вы не можете связывать с ним браши и другие сущности!

Примеры карт

  • sourcesdk_content\hl2\mapsrc\
    • sdk_func_detail.vmf
    • sdk_hints.vmf
    • sdk_occluders.vmf

См. также

  • func_lod (Для повышения производительности детали не должны прорисовываться далеко.)