Оптимизация видимости
Без информации о видимости, всё на карте будет отрисовываться независимо от того, видит это игрок или нет. Очевидно, что количество объектов/элементов мира для обработки нужно ограничить, но как? Проверка действительной видимости игроку каждого объекта или поверхности занимает гораздо больше процессорного времени, чем непосредственно отрисовка этих объектов/элементов.
Игровыми платформами использует компромисс; и
GoldSrc и
Source используют модель двоичного разбиения пространства на основе разработки
Джона Кармака, реализованной в
Quake. На этой странице объясняется, как это работает и как этим управлять.
Области видимости
Внутреннее (т.е. не занятое элементами карты мира) пространство карты мира разделяется на области видимости. Видимость между этими 3-х мерными объёмами рассчитывается во время компиляции, и встраивается в BSP-файл для использования платформой игры. Как и элементы карты мира, области видимости всегда являются выпуклыми объёмами.
Рисунок слева показывает, как области видимости создаются в изгибах коридоров (промежутки между ними добавлены для наглядности). Тут нет прямой видимости между областями 1 и 3, поэтому, когда камера находится в одной части коридора, содержимое в другой части не отрисовывается. Игровой платформе оказывается достаточно просто определить это по встроенной в BSP-файл информации о видимости.
Но есть проблема с областью 2. Содержимое всех трёх областей отрисовывается, когда камера находится внутри неё, даже вне поля обзора, даже если левая стена полностью закрывает обзор. Существуют инструменты для решения этой проблемы, которые рассмотрим позднее, но имейте в виду, что во многих случаях устранение этой проблемы обойдется дороже, чем просто отрисовка неоптимальной сцены.
Помните, что деформированные поверхности, точечные объекты и объёмные объекты (включая элементы детализации) не влияют на области видимости. Создание элементов карты с текстурой Nodraw "основано" на этой проблеме: деформированные поверхности часто создаются как детализация 'внешнего вида', покрывающая герметизирующую основу из обычных элементов карты.
Сокращение времени компиляции VIS
VVIS (или VIS/HLVIS в
) - это инструмент, который рассчитывает видимость между областями (в то время, как VBSP (или VIS/HLVIS) создает их). Расчёт не занимает и нескольких минут даже для сложных карт, но если время затянулось, то проделайте следующие шаги.
- Используйте элементы детализации.
- Размещайте World brush строго по сетке. Наилучшими размерами являются кратные степеням 2.
- Используйте простые элементы карты без излишних преобразований инструментами вырезки и операций с вершинами, если не уверены в результате.
- Располагайте func_viscluster (Во всех играх начиная с
) на больших открытых пространствах карты со сквозной видмостью. Области видимости в кластере будут видеть друг друга.
Примечание: If using VVIS++, it is recommended to avoid using func_viscluster, as VVIS++ is fast enough that wide, open areas do not make visibility calculations grow exponentially in time anymore. Using VVIS++ without visclusters also helps improve performance compared to using visclusters, while also avoiding other issues and workarounds when using func_visclusters.
- Избегайте создания больших открытых пространств, которые игрок изначально не видит, если в этом нет необходимости. Используйте объёмное небо, чтобы уменьшить размер неба и создайте герметизирующие элементы карты под деформированными поверхностями.
Помните, что время компиляции VIS и производительность в игре - совершенно разные вещи. Вполне может быть, что длительная компиляция обеспечивает увеличение производительности в игре.
Просмотр областей видимости
Начиная c
Source 2007 версия
Hammer имеет новую функцию просмотра областей видимости карты в окне 3D вида: Map > Load Portal File (Карта > Подключить файл порталов). Она показывает грани соприкосновения областей видимости жирными синими линиями. Это фантастический обучающий инструмент, и если компилировали карту без VIS или RAD (перезагрузите файл портала, чтобы обновить экран), чтобы сразу увидеть изменения.
Пользователям
Source 2006 и более ранних версий, необходимо использовать программу glview.
Для просмотра в игре, наберите в терминале переменную "mat_leafvis". mat_leafvis 3 очертит все области видимости в массиве потенциальной видимости, в то время, как mat_leafvis 1 будет очерчивать только области видимости, на которые смотрит камера. (Эта переменная является обходной.)
Также можно проверить геометрию с помощью переменной управления mat_wireframe. mat_wireframe 1 покажет какие полигоны отрисовываются в текущем массиве потенциальной видимости. (Эта переменная также является обходной.)
Элементы указания
К сожалению, области видимости не всегда получаются так хорошо, как показано в первом примере. Рассмотрим иное расположение областей слева (на практике, оно получится как на первом рисунке, но оставим это на потом): в этом примере все области видимости видят друг друга, что приводит к отрисовке всего коридора одновременно, что не очень хорошо. Вот тут и пригодятся Элементы указания.
Секущая Hint - это грань элемента карты покрытая служебной текстурой tools\toolshint, которая разделяет области видимости на двух пересечениях (поверхности, которые не разделяют области видимости, должны быть покрыты текстурой tools\toolsskip). В нашем примере мы поставили секущую грань там, где проходит фиолетовая линия, которая разделяет области видимости 1 и 3 такой же формы, как показано в первом примере.
Это не даёт области видимости соединиться, так что в итоге появятся три отдельных области видимости справа. К счастью, это небольшая проблема.
Элементы детализации
Как уже упоминалось, области видимости создаются вокруг обычных элементов карты. Но что, если это не нужно? Если у есть элемент карты, который постоянно виден (например, постамент статуи или небольшая отдельно стоящая стена), нет смысла создавать вокруг них дополнительные области видимости.
В таких ситуациях пригодитсяfunc_detail. Это внутренний объект, который заставляет компилятор игнорировать элемент карты при расчёте видимости, не влияя на его поведение. Нередко большие участки элементов на карте делают элементами детализации.
Неотрисовываемые поверхности
Если игрок не может видеть грани элементов карты без обходных команд или режима наблюдателя, хорошая мысль применить служебную текстуру Nodraw. Nodraw удаляет все грани во время компиляции без ущерба для видимости, что уменьшает время отображения, убирает необходимость рассчитывать карту освещения, уменьшает размер файла карты.
Нет необходимости применять Nodraw к граням, соприкасающимся с пустотой (т.е. за пределами карты) или элементов карты, чьи грани совпадают, будучи одним объектом (когда весь мир - один единый объект). Смотрите Элемент карты.
(в
Порталы областей (только в
Source)
На изображении слева все области видимости видят друг друга, и в этот раз секущие грани Hint мало что могут сделать.
В такой ситуации нужно создать портал областей в выбранном проеме. Они ограничивают угол обзора объектов за своей линией, сквозь них движок не „видит“ ничего и производительность тем выше, чем больше объектов закрывает портал областей.
Рисунок показывает порталы областей в каждом проеме, но четыре портала скорее всего больше снизят производительность, чем принесут пользу. Ваша стратегия зависит от степени загрузки каждой зоны, и чаще всего лучше поставить один портал областей в коридоре справа.
(В этой ситуации можно использовать секущие грани Hint для сокращения видимости, но только в минимальном количестве и под выверенными углами, так как это влияет на производительность. Если за секущими гранями в комнате ничего не видно, то следует использовать портал областей!)
Прикрытия (только в
Source)
Иногда требуется блокировать видимость способом, который невозможно достичь с помощью областей видимости: рассмотрим пример разрушаемой стены, за которой находится несколько затратных моделей персонажей. Нет необходимости отрисовывать модели, если они не видны игроку, но сделать это без элементов, разделяющий области видимости, нельзя.
Прикрытие - это возможность решить эту задачу. Это объём, который при включении скрывает модели (к сожалению, не элементы карты) позади себя, подобно порталу областей, скрывающему всё в областях за ним. По очевидным причинам, он должен полностью находиться внутри непрозрачного объекта.
Однако некоторые элементы можно преобразовать в модели с помощью таких инструментов, как реквизитор Propper. Таким образом, получится скрыть больше с помощью прикрытия. Это следует делать с элементами детализации, которые не используются для разделения областей видимости.
Расстояние отрисовки
Если имеете дело с большим открытым пространством, без каких либо препятствий, то всё что можно сделать, чтобы замаскировать малое расстояние отрисовки, это использовать туман. Настройка расстояния отрисовки в Map > Properties > Far z_clip plane (farz).
Расстояния отрисовки также можно выборочно применять к объектам реквизита, например prop_static, с ключ-параметрами Start Fade Dist/Pixels (Дистанция начала исчезновения) и End Fade Dist/Pixels (Дистанция полного исчезновения). Как видно из названия, эти значения указывают расстояние в единицах или пикселях, если установлено значение ключ-параметра Screen Space Fade (Исчезновение по размеру на экране).
Если указать расстояние исчезновения для реквизита, то возьмите за правило держать разницу между двумя значениями (начала и конца) порядка 200. Это выглядит довольно хорошо, и чем больше число, тем тяжелее модель для визуализации. Модели в процессе появления и исчезновения не сразу нагружают/разгружают движок.
func_lod — это специальный объёмный объект, который может исчезать. Однако, нельзя связывать с ним элементы карты и другие объекты!
Примеры карт
sourcesdk_content\hl2\mapsrc\sdk_func_detail.vmfsdk_hints.vmfsdk_occluders.vmf






