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

Оптимизация видимости

From Valve Developer Community
< Ru
Jump to navigation Jump to search
English (en)Español (es)Français (fr)Русский (ru)中文 (zh)Translate (Translate)

Edit Tabs
Icon-callout-cleanup.png
This article or section needs to be cleaned up to conform to a higher standard of quality because:
Reason 
This article originally exclusively covered Source Source, but GoldSrc GoldSrc info has been added, as most of the same concepts apply. Nonetheless, much of the Source-only stuff is not properly marked as such, and the optimization features provided by ZHLT(en) and the now-standard VHLT(en) are not mentioned.

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

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

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

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

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

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

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

Помните, что деформированные поверхности(en), точечные объекты(en) и объёмные объекты(en) (включая элементы детализации) не влияют на области видимости. Создание элементов карты(en) с текстурой Nodraw(en) "основано" на этой проблеме: деформированные поверхности(en) часто создаются как детализация 'внешнего вида', покрывающая герметизирующую основу из обычных элементов карты.

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

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

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

  • Используйте элементы детализации.
  • Размещайте World brush(en) строго по сетке. Наилучшими размерами являются кратные степеням 2.
  • Используйте простые элементы карты без излишних преобразований инструментами вырезки(en) и операций с вершинами(en), если не уверены в результате.
  • Располагайте func_viscluster (Во всех играх начиная с Half-Life 2: Episode Two) на больших открытых пространствах карты со сквозной видмостью. Области видимости в кластере будут видеть друг друга.
    • Note.pngПримечание: 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.
  • Избегайте создания больших открытых пространств, которые игрок изначально не видит, если в этом нет необходимости. Используйте объёмное небо(en), чтобы уменьшить размер неба и создайте герметизирующие элементы карты под деформированными поверхностями(en).

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

Tip.pngСовет: Если игра поддерживает VVIS++(en), используйте его вместо обычного VVIS. Эта модификация VVIS значительно сокращает время компиляции, получая идентичный результат.

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

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

Пользователям Source 2006 Source 2006 и более ранних версий, необходимо использовать программу glview(en).

Tip.pngСовет: Чтобы стало еще яснее, используйте автоматическую группировку(en), которая удаляет из карты элементы, которые не блокируют видимость - т.е. всё, кроме "World Geometry(Элементов карты)", "Tool Brushes (Функциональных объёмов)", "Water (Воды)" и "Displacements (Деформированных поверхностей)".

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

Также можно проверить геометрию с помощью переменной управления mat_wireframe. mat_wireframe 1 покажет какие полигоны отрисовываются в текущем массиве потенциальной видимости(en). (Эта переменная также является обходной(en).)

Элементы указания

Основная статья: Элементы указания
tools\toolshint
Все области видимости отрисовываются одновременно, пока нет секущего элемента.

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

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

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

Tip.pngСовет: Целесообразно использовать секущие Hint для разделения участков сложной(en) и простой(en) геометрии в одной области видимости, если это сократит время отрисовки сложных участков.

Элементы детализации

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

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

В таких ситуациях пригодитсяfunc_detail. Это внутренний объект(en), который заставляет компилятор игнорировать элемент карты при расчёте видимости, не влияя на его поведение. Нередко большие участки элементов на карте делают элементами детализации(en).

Неотрисовываемые поверхности

Основная статья: Nodraw
tools\toolsnodraw в Source
NULL, from ZHLT.WAD and HLBASICS.WAD

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

Нет необходимости применять Nodraw к граням, соприкасающимся с пустотой (т.е. за пределами карты) или элементов карты, чьи грани совпадают, будучи одним объектом (когда весь мир - один единый объект). Смотрите Элемент карты(en).

Tip.pngСовет: (в Source) При компиляции VBSP объединяет все элементы детализации func_detail в один объект при компиляции, поэтому совпадающие грани func_detail не нужно делать неотрисовываемыми, если только элемент не покрыт прозрачным или полупрозрачным материалом.
(в GoldSrc) HLCSG removes func_detail faces that share a detail level, or are flush with a lower detail level.

Порталы областей (только в Source Source)

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

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

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

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

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

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

Прикрытия (только в Source Source)

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

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

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

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

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

Если имеете дело с большим открытым пространством, без каких либо препятствий, то всё что можно сделать, чтобы замаскировать малое расстояние отрисовки, это использовать туман(en). Настройка расстояния отрисовки в Map > Properties > Far z_clip plane (farz).

Расстояния отрисовки также можно выборочно применять к объектам реквизита, например prop_static, с ключ-параметрами(en) Start Fade Dist/Pixels (Дистанция начала исчезновения) и End Fade Dist/Pixels (Дистанция полного исчезновения). Как видно из названия, эти значения указывают расстояние в единицах или пикселях, если установлено значение ключ-параметра Screen Space Fade (Исчезновение по размеру на экране).

Tip.pngСовет: Фактически, все объекты, использующие модели, могут исчезают на расстоянии, так же как накладки(en). Однако эти ключ-параметры не указаны в FGD-файле(en) для большинства таких объектов.

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

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

Примеры карт

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

Смотреть также