Ru/Areaportal: Difference between revisions
Line 120: | Line 120: | ||
{{Note:ru|Браши ареа-порталов и окклюдеров не должны пересекаться (соприкасаться), иначе они будут работать неправильно.}} | {{Note:ru|Браши ареа-порталов и окклюдеров не должны пересекаться (соприкасаться), иначе они будут работать неправильно.}} | ||
== | == См. также == | ||
* {{Ent|func_areaportal}} / {{Code|[[CAreaPortal]]}} | * {{Ent|func_areaportal}} / {{Code|[[CAreaPortal]]}} | ||
* {{Ent|func_areaportalwindow}} | * {{Ent|func_areaportalwindow}} | ||
* {{Code|[[CAreaPortalOneWay]]}} (C++ code for new entity) | * {{Code|[[CAreaPortalOneWay]]}} (C++ code for new entity) | ||
* [[Controlling Geometry Visibility and Compile Times]] | * [[Controlling Geometry Visibility and Compile Times|Управление видимостью геометрии и временем компиляции]] | ||
* [[Leak]] | * [[Leak|Утечки]] | ||
* [[Visleaf]] | * [[Visleaf|Листы]] |
Revision as of 23:44, 6 April 2023
Areaportal — брашевая сущность, func_areaportal, func_areaportalwindow, которую можно использовать для 'изолирования' листьев и управления видимостью.
Areaportal'ы служат двум разным целям: усечению геометрии и удалению целых областей из отрисовки.
Areaportal'ы похожи на дверные проёмы, которые либо открыты, либо закрыты. Когда Areaportal закрыт, он блокирует видимость геометрии и объектов, расположенных в области за ним. Когда он открыт, геометрия становится видимой. Areaportal'ы можно динамически открывать и закрывать во время игры. Обычно, они настраиваются на открытие и закрытие набором брашей trigger_multiple с помощью системы ввода/вывода или связыванием с сущностью двери.
Свойства
Areaportal'ы:
- связаны с сущностью func_areaportal;
- должны состоять только из одного браша. Areaportal'ы из более чем одного браша будут выдавать ошибку компиляции vbsp;
- должны использовать материал
tools\toolsareaportal
, покрывающий все стороны браша; - не должны содержать деформированных поверхностей, иначе будет выдана ошибка vbsp;
- должны использоваться для запечатывания всех зон, с которыми соприкасаются, чтобы избежать утечек;
- это объём, а не отдельные поверхности. Areaportal'ы могут быть любого размера, но обычно они состоят из тонких брашей по размеру зон (дверных проёмов), которые они соединяют;
- создают новый visleaf по своему объёму;
- можно настроить на открытие или закрытие в зависимости от логики сущности или путём присоединения их к сущности двери.
areaportal_window
Сущность func_areaportalwindow ведёт себя как обычный Areaportal, с добавлением затухания и закрытия в зависимости от удалённости игрока. Это позволяет избежать «резкого» открытия Areaportalа.
Конструкция
- Создайте объём из одного твёрдого браша, полностью запечатав пространство между двумя зонами, которыми вы желаете управлять. Это может быть несколько Areaportal, соприкасающихся гранями. Не создавайте Areaportal с более, чем шестью сторонами.
- Если Areaportal соединяет две области, например, дверной проём, сделайте браш размером с проём и такой же толщиной, как и стены, с которыми он соприкасается. Если область представляет собой открытое пространство, то толщина может быть любой (типичные размеры сетки: 8, 16, 32 и т. д.).
- Наложите материал Tool textures#Optimisation tools\toolsareaportal на все грани браша.
- Свяжите браш с сущностью func_areaportal или func_areaportalwindow.
- Установите значение ключа Initial State (изначальное состояние) так, чтобы оно не блокировало видимость, когда этого не должно быть. Если вы хотите связать портал с наименованной дверью, установите его Initial State в то же состояние, что и для двери, и внесите имя двери в строку портала Name of Linked Door (имя связываемой двери). Если дверь закрыта, изначальное состояние портала также должно быть закрытым, и наоборот.

Влияние на производительность
Открытые порталы (не важно, открыты они всегда, или же по команде) ведут себя, как шторки для видимой сквозь них геометрии. Подобно окну дома, движок отрисовывает только те листья, которые непосредственно видны через портал. То есть, область за ним обрезается по размеру окна, уменьшая величину отображаемой геометрии и улучшая производительность. Вдобавок ко всему, часть модели (prop) вообще не отрисовывается, когда она видна под усечённым конусом (или видимым углом). Это делает открытые порталы весьма полезными для управления видимостью геометрии моделей.
Благодаря таким преимуществам в производительности, Areaportal часто используются в состоянии всегда открыт. Всегда открытый портал создаётся путём установки ключа "Initial State" (изначальное состояние) сущности func_areaportal в значение «Open» (открыт). Открытые порталы используются на входе в другие области, содержащие большое число листов и геометрии. Например, такой портал, размещённый в конце коридора, выходящего на более широкое пространство, может дать существенный прирост производительности. Пока игрок смотрит сквозь дверь изнутри, будут отрисовываться только те листья с геометрией, которые видны непосредственно через проём.
Излишества
Будьте осторожны, и не создавайте слишком много видимых порталов. Каждый из них съедает ресурсы, и если портал отсекает недостаточно деталей, отрисовка сцены без него ускорится!
На скомпилированной карте Areaportal не образуют брашей, поэтому нет ограничений на их размер. Это может быть полезно, когда у вас переполненный BSP и вы используете множество Hint-брашей.
Компиляция
Жизненно важно, чтобы любые зоны, которые должен изолировать Areaportal, не перетекали друг в друга. Как и при обычных утечках, область карты считается изолированной от другой только тогда, когда она полностью окружена простыми брашами (не являющимися сущностями, кроме брашей Areaportal), без промежутков. Если области соединены по-разному, каждая из них должна быть заполнена Areaportal.
Понять это поможет воображаемый аквариум с водой и несколькими отверстиями по краям. Ареа-портал должен заполнить каждое из этих отверстий, иначе область будет утекать, выдавая ошибку утечки в vbsp.
Ареа-порталы должны изолировать каждый вход в зону. Браши-детали, полупрозрачные текстуры и деформации не могут изолировать область, и будут создавать утечки, препятствующие запуску карты. Если компилятор сможет найти лазейку между двумя основными поверхностями любого портала, будет выдана утечка портала.
Обнаружение ошибок компиляции
Ошибки компиляции ареа-порталов выводятся функцией VBSP. Если произойдёт утечка, вы увидите это:
Brush <brush number>: areaportal brush doesn't touch two areas done
(Браш <номер браша> не касается двух областей). Порой, такие сообщения обнаружить труднее, чем сообщения об утечке, но vbsp создаёт pointfile, который делает поиск местоположения утечки порталов таким же простым, как и поиск обычных утечек геометрии.
Ареа-порталы и вода
Другой сложностью является то, что ареа-порталы не должны пересекать водную поверхность. Для этого нужно создавать два портала: один - над водой, другой - под водой, и так, чтобы они оба сошлись над водной плоскостью.
Объединение
По соображениям оптимизации, ареа-порталы, которые находятся в одной плоскости (выровнены), автоматически объединяются движком. Если такое объединение нежелательно, просто сдвиньте браши порталов относительно плоскости. Для этого достаточен сдвиг всего лишь на одну единицу сетки.
Сквозной взгляд
Ареа-порталы отсекают только те области, между которыми они расположены. Посмотрите на рисунок справа: отбрасываются только помещения внутри здания, а видимость между первым и вторым листом сохраняется, поскольку они соединены по краям.
Это можно исправить, поставив два ареа-портала по краям здания.
Консольные команды
Вы можете отлаживать и тестировать порталы прямо в игре, используя некоторые специфичные для них консольные переменные:
- r_DrawPortals 0/1
- Если установлено значение "1", границы портала (между двумя областями) окрашиваются в зелёный цвет. Иногда несколько порталов объединяются в один. Если портал открыт, рисуется вторая зелёная коробка, показывающая отсекаемое пространство.
- mat_wireframe 0/1/2/3
- Рисует геометрию в виде каркаса, что позволяет легко видеть эффекты ареа-порталов на карте. Лучше всего использовать значения "1" или "2", так как параметр "3" может скрыть фактически отрисовываемую геометрию.
- r_portalscloseall 0/1
- Значение "1" принудительно закрывает все порталы (без возможности их открыть). Отменяется
r_portalsopenall 1
. (Пробуйте это, когда кажется, что порталы зависли. Помогает понять, глючит ли их закрывание.)
- r_portalsopenall 0/1
- Значение "1" принудительно открывает все порталы (без возможности их закрыть).
В многопользовательском режиме
Ареа-порталы весьма полезны в многопользовательских играх. Они создаются таким же образом, как и в однопользовательских играх, но с некоторыми отличиями в функциях и использовании. При наличии на сервере нескольких игроков, ослабевает управляемость открыванием порталов, поэтому производительность уровня должна быть оптимизирована под худшие сценарии (например, когда все видимые порталы открыты). Поэтому, сначала размещаются 'всегда открытые' порталы, потом порталы, связанные с дверями, а затем порталы, управляемые триггерами. В запущенных случаях, хорошо продуманные 'всегда открытые' порталы повысят производительность больше, чем управляемые.
Портальные окна также могут использоваться в мультиплеере, но здесь они менее полезны, так как могут создавать игровой дисбаланс. Игрок внутри помещения, находясь рядом с порталом окна, может видеть всех игроков вовне, а игроки вовне видеть его не могут.
Относительно окклюдеров
Ареа-порталы похожи на окклюдеры в том смысле, что они помогают управлять видимостью. Их основные отличия:
- Окклюдеры скрывают только геометрию моделей (prop). Ареа-порталы скрывают все объекты.
- Ареа-порталы должны полностью запечатывать область (не допускать утечки), в то время как окклюдеры могут стоять где угодно внутри области.
- Окклюдеры более затратны на объект, чем открытые ареа-порталы.
- Окклюдеры имеют элементы управления размером объектов, которые они будут скрывать, в зависимости от площади экрана.
См. также
- func_areaportal / CAreaPortal
- func_areaportalwindow
- CAreaPortalOneWay (C++ code for new entity)
- Управление видимостью геометрии и временем компиляции
- Утечки
- Листы