Ru/VIS optimization
Без "видимости", карта прорисовывает все предметы независимо от того, видит их игрок или нет. Очевидно, какие-то объекты нужно исключить из обработки, но как? Проверка каждого объекта на степень загрузки видео займет много времени.
Движок игры должен создавать компромисс; Source - это модель Binary Space Partition на основе разработки Джона Кармака, реализованной в Quake. Данная страница объясняет, как это работает и как этим манипулировать.
Листья
Интерьер (т.е. не занятое брашами world brush) пространство карта BSP разделяет на листья visleaves. Видимость в этом 3-х мерном объеме рассчитывается во время компиляции, и встраивается в файл карты для использования движком. Как и браши, листья всегда выпуклые.
Рисунок слева показывает, как листья создаются в изгибах коридоров (промежутки между ними добавлены для ясности). Тут нет прямой видимости между листами 1 и 3, поэтому, когда камера находится в одном коридоре, содержимое другого не прорисовывается. Насколько это облегчает движок, видно по графику видимости, включенном в карту.
Но есть проблема с листом 2. Содержимое "всех трех" листов прорисовывается, когда камера находится внутри, усекая картинку конусообразно, даже если левая стена полностью закрывает вид. У нас есть инструменты для преодоления этого, и мы их скоро рассмотрим, но имейте в виду, что решить проблему будет труднее (expensive), нежели просто оптимально нарисовать сцену.
Постоянно имейте в виду, что дисплейсменты, сущности точка и браш (включая detail brushes), а также браши с поверхностями $translucent не влияют на листья. Создание браша world brush с текстурой nodraw 'основано' на этой проблеме: это типично для дисплейсментов, созданных как деталь, покрывающая каркас обычных брашей.
Сокращение времени компиляции VIS
VVIS - это инструмент, который рассчитывает видимость между листьями (в то время, как VBSP создает их). Расчет не занимает и нескольких минут даже для сложных карт, но если время затянулось, то проделайте следующие шаги.
- Используйте detail brushes.
- Размещайте world brush строго по сетке. Размер сетки лучше всего выставить на два.
- Используйте простые браши. Не вырезайте (carve), если не уверены в результате.
- Располагайте
func_viscluster (Во всех играх начиная с ) на больших площадях с не загороженным видом. Листья в нем будут видеть друг друга.
- Не создавайте больших открытых пространств, которые игрок изначально не видит, если в этом нет необходимости. Используйте 3D Skybox, чтобы уменьшить размер неба и создайте скелет брашей под дисплейсментами.
Помните, что время компиляции VIS и производительность в игре - две очень разные вещи. Вполне может быть, что длительная компиляция стоит своего результата.
Просмотр листьев
Orange Box-версия Хаммера имеет новую функцию просмотра листьев в 3D-виде: Map > Load Portal File. Он показывает грани соприкосновения листьев жирными синими линиями. Это фантастический обучающий инструмент, и если вы компилировали карту без VIS или RAD (перезагрузите файл портала чтобы обновить экран), вы сразу увидите изменения.
Пользователи Episode One должны полагаться на приложение glview.
Для просмотра в игре, наберите в консоли переменную "mat_leafvis". mat_leafvis 3
отчертит все вис-листья в PVS, в то время, как mat_leafvis 1
будет очерчивать только листья, на которые смотрит камера. (Эта переменная является читом.)
Вы также можете проверить геометрию с помощью переменной консоли mat_wireframe. mat_wireframe 1
отобразит как полигоны, прорисованные в текущемt PVS. (Эта переменная также является читом.)
Хинты
К сожалению, листья не всегда выходят так хорошо, как показано в первом примере. Рассмотрим альтернативный макет слева (на практике, он будет сконфигурирован как на первом рисунке, но пока отложим это в сторону): в этом примере листья могут видеть друг друга, что приводит к прорисовке всей зоны сразу, что не очень хорошо. Подробнее здесь: Хинты.
Хинт - это брашевая поверхность с текстурой специального материала tools\toolshint
, которая нарезает листья на двух пересечениях (поверхности, которые не разрезают листья, должны быть покрыты текстурой tools\toolsskip
). В нашем примере мы поставили хинт там, где проходит фиолетовая линия, которая режет листы 1 и 3 такой же формы, как показано в первом примере.
Это не дает листам соединиться, так что в итоге появятся три отдельных листа справа. К счастью, это небольшая проблема.
Браши-детали
Как сказано выше, листья формируются вокруг обычных брашей. Но что делать, если вам этого не нужно? Если ваши браши постоянно на виду (например, статуя, отдельно стоящая небольшая стена), нет никакого смысла создавать листья вокруг них.
В таких ситуациях вам поможет func_detail. Это внутренняя сущность, которая заставляет компилятор игнорировать браши во время расчета пространства, не влияя на него. Это не редкость, когда большие участки карт делают деталью.
Поверхности Nodraw
Если игрок не может видеть поверхность браша без чита или режима спектатора, хорошая мысль применить специальный материал nodraw. Нодро удаляет все поверхности во время компиляции без ущерба для видимости, что уменьшает время рендеринга, убирает необходимость рассчитывать карту освещенности, уменьшает вес файла.
Вам нет необходимости применять нодро к поверхностям, соприкасающимся с пустотой (т.е. за пределами карты) или брашам, чьи поверхности тесно соприкасаются, будучи одой сущностью (когда весь мир - одна большая сущность). См. Браши.
Ареапорталы
На изображении слева все листья видят друг друга, и в этот раз хинты мало что могут сделать.
В такой ситуации мы должны создать ареапорталы в выбранном проеме. Они ограничивают угол обзора объектов за своей линией, сквозь них движок не "видит" ничего и производительность тем выше, чем больше объектов закрывает ареапортал.
Рисунок показывает ареапорталы в каждом проеме, но четыре портала скорее всего больше снизят производительность, чем принесут пользу. Ваша стратегия зависит от степени загрузки каждой зоны, и чаще всего лучше поставить один ареапортал в коридоре справа.
(В этой ситуации можно использовать хинты для ограничения видимости, но очень осторожно и с точными углами, которые определенно влияют на производительность. Если за хинтами в комнате вы ничего не видите, значит надо ставить ареапортал!)
Окклюдеры
Иногда требуется блокировать видимость способом, который не позволяют листья: перед вами разрушаемая стена, за которой находится несколько "тяжелых" моделей персонажей. Вам не хочется прорисовывать модели, если они не попадают в поле зрения, но сделать это без брашей, разрезающих листья, нельзя.
Окклюдер - то, что надо. Это браш, который скрывает модели (не браши, увы) позади себя, будучи включенным, как и ареапортал. По понятным причинам, он должен целиком находиться внутри непрозрачного объекта.
Draw distance
If you are dealing with a large open area without any cover at all then there isn't a lot you can do but remove detail or employ fog to disguise a low draw distance. Configure draw distance with Map > Properties > Far z_clip plane.
Draw distances can also be applied selectively to props, even prop_static, with the Start Fade Dist/Pixels and End Fade Dist/Pixels keyvalues. As the names suggest, these values can represent either distance in units or pixels on-screen as per the Screen Space Fade KV.
If you enter fade distances on props, it’s a good general rule to have the difference between the two numbers (start and end) be 200. It looks pretty good, and the larger that number is, the longer the model incurs an increased cost to render. Fading models do not go through the fast path and incur additional sorting cost.
func_lod
is a special brush entity that can fade out. You can't use any brushes tied to it as any other entity, however!
Sample maps
sourcesdk_content\hl2\mapsrc\
sdk_func_detail.vmf
sdk_hints.vmf
sdk_occluders.vmf
<< Return to Optimization (level design)
See Also
- Func_lod (World detail that doesn't need to be drawn far away, for performance reasons.)